sql - SQLite查询每月的第n天

标签 sql sqlite datetime date-arithmetic

说,我有下表:

CREATE TABLE Data (
    Id INTEGER PRIMARY KEY,
    Value DECIMAL,
    Date DATE);


由于该应用程序与财务相关,因此用户可以选择哪一天是该月的第一天。例如,如果他每个月的第10天收到薪水,则可以将每月的第一天设置为第10天。

我想创建一个查询,该查询返回用户定义的每月第n天的平均值。例如:

 Date           | Value
 ---------------+------
 10.01.2016     | 10
 11.01.2016     | 15
 10.02.2016     | 20
 11.03.2016     | 10


查询结果应为:

 Day | Average
 ----+--------
 1   | 15
 2   | 12.5


请注意,如果用户将第一天设置为每月的10号,9号,则可能是一个月的28号,29号,30号或31号(取决于我们所讨论的月份)。因此,这并不像从日期中提取天数那样简单。

最佳答案

假设日期值不使用格式dd.mm.yyyy,而是使用supported date formats之一,则可以使用built-in date functions进行计算。

要计算两个日期之间以天为单位的差异,请将其转换为以天为数字的日期格式,即儒略日。

要获得一个月的“基准”日,我们可以使用修饰符:

> SELECT julianday('2001-02-11') -
         julianday('2001-02-11', 'start of month', '+10 days') + 2;
2.0


(之所以需要+2,是因为我们加到每月的1号,而不是0号,并且从1开始计数,而不是0。)

如果日期在十分之一之前,则计算值将变为零或负值,而我们必须改用前一个月:

> SELECT julianday('2001-02-09') -
         julianday('2001-02-09', 'start of month', '-1 month', '+10 days') + 2;
31.0


将这些结果组合到此表达式中以计算日期Date的n:

CASE
WHEN julianday(Date) -
     julianday(Date, 'start of month', '+10 days') + 2 > 0
THEN julianday(Date) -
     julianday(Date, 'start of month', '+10 days') + 2
ELSE julianday(Date) -
     julianday(Date, 'start of month', '-1 month', '+10 days') + 2
END


您可以在查询中使用它:

SELECT CASE...END AS Day,
       AVG(Value) AS Average
FROM Data
GROUP BY Day;

关于sql - SQLite查询每月的第n天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38322317/

相关文章:

javascript - 将Kendo Grid列显示为DateTime,但过滤时忽略Time

sql - SQL 中基于下一条记录和上一条记录的复杂排序

MySQL UNION ALL 给出了不需要的值,但存在超前滞后

python - Pyodbc 批量插入语句不会参数化

mysql - 按日期分组,给定一个 varchar(字符串)

android - 创建带有更新的新闻应用程序 android

c# - 日期格式 yyyymmdd 到 yyyy-mm-dd

mysql - 如何在SQL中查询日期以获得上周的数据

java - 用于SQLite/java.text.ParseException的SQL查询:无法解析的日期

ios - 在 iOS 上填充 SQLite FTS 表时遇到问题