gpt4 book ai didi

sql - SQLite查询每月的第n天

转载 作者:行者123 更新时间:2023-12-03 19:33:25 24 4
gpt4 key购买 nike

说,我有下表:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com