【问题标题】:SQLite query for n-th day of month每月第 n 天的 SQLite 查询
【发布时间】:2016-07-12 07:16:44
【问题描述】:

说,我有下表:

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 日(取决于我们所讨论的月份)。所以这并不像从日期中提取天数那么简单。

【问题讨论】:

  • 我可以想象这会变得很棘手,因为不同的月份有不同的天数。在某些月份(例如 2 月),天数会随年份变化。

标签: sql sqlite datetime date-arithmetic


【解决方案1】:

假设日期值不使用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

在这个表达式中结合这些结果来计算日期Daten

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;

【讨论】:

    【解决方案2】:

    似乎我同时找到了一个不同的解决方案:

    SELECT avg(Amount),
           strftime("%d", Date, "-9 days") AS day
    FROM (
        SELECT sum(Amount) AS Amount,
            strftime("%Y-%m-%d", Date, "start of day") AS Date
        FROM Operations
        GROUP BY strftime("%Y-%m-%d", Date, "start of day")
    )
    GROUP BY day;
    

    “-9 天”是指每月的 10 号(所以 first_day-1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多