SQLite组日期时间以168小时(7天)为单位返回NULL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLite组日期时间以168小时(7天)为单位返回NULL相关的知识,希望对你有一定的参考价值。

我在SQLite数据库中有一个Orders表。我想做的是每168小时(7天)对数据进行分组,并计算为每168小时总计Orders

我所做的是创建一个内存中的“日历表”,并将我的Orders表加入了该日历集。

当我按12、24、48甚至120小时(5天)分组时,这很好。但是由于某些原因,当我分组168小时(7天)时,它不起作用。我得到的是NULL值,而不是count()应该真正返回的值。

以下sql代码是一个示例,每120小时(5天)进行分组。

CREATE TABLE IF NOT EXISTS Orders (
    Id    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    Key   TEXT,
    Timestamp TEXT NOT NULL
);

INSERT INTO Orders (Key, Timestamp) VALUES ('k1', '2019-10-01 10:00:23');
INSERT INTO Orders (Key, Timestamp) VALUES ('k2', '2019-10-01 15:45:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k3', '2019-10-02 17:05:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k4', '2019-10-03 20:12:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k5', '2019-10-04 08:49:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k6', '2019-10-05 11:24:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k7', '2019-10-07 11:24:19');

WITH RECURSIVE dates(date1) AS (
    VALUES('2019-10-01 00:00:00')
    UNION ALL
    SELECT datetime(date1, '+120 hours')
    FROM dates
    WHERE date1 <= '2019-10-29 00:00:00'
)
SELECT date1 as __ddd, d2.* FROM dates AS d1

LEFT JOIN (
    SELECT count(Key) AS OrderKey, 
    datetime((strftime('%s', timestamp) / 432000) * 432000, 'unixepoch') as __interval 
    FROM `Orders` 
    WHERE `Timestamp` >= '2019-09-29T00:00:00.000' 
    GROUP BY __interval  LIMIT 10 
) d2 ON d1.date1 = d2.__interval

重要提示:如果要更新此代码以在168小时(7天)内对其进行测试,则应执行以下操作:

  • +120 hours更改为+168 hours
  • 432000(432000 == 120小时)更改为604800(604800 == 168小时)
    • 请注意,此数字出现两次,都应替换

任何人都知道我将sql代码更改为168小时后为何它无法正常工作吗?

答案

您的问题是,当您更改为7天的间隔时,dates CTE中的值与Orders表中生成的间隔不一致。您可以通过使dates CTE在类似对齐的日期开始来解决此问题:

WITH RECURSIVE dates(date1) AS (
    SELECT datetime((strftime('%s', '2019-10-01 00:00:00') / 604800) * 604800, 'unixepoch')
    UNION ALL
    SELECT datetime(date1, '+168 hours')
    FROM dates
    WHERE date1 <= '2019-10-29 00:00:00'
)

输出:

__ddd               OrderKey    __interval
2019-09-26 00:00:00 3           2019-09-26 00:00:00
2019-10-03 00:00:00 4           2019-10-03 00:00:00
2019-10-10 00:00:00 null        null
2019-10-17 00:00:00 null        null
2019-10-24 00:00:00 null        null
2019-10-31 00:00:00 null        null

Demo on dbfiddle

以上是关于SQLite组日期时间以168小时(7天)为单位返回NULL的主要内容,如果未能解决你的问题,请参考以下文章

从日期算起多少天/小时/秒

以小时为单位获取两个日期之间的长度

在 Excel 中,我需要以天小时分钟秒为单位转换秒数

Excel中有日期(一年365天)、时间(一天24小时)、风速、风向、温度、辐照等数据,现在我要计算

R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间

SQLite 按日期排序1530019888000