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
以上是关于SQLite组日期时间以168小时(7天)为单位返回NULL的主要内容,如果未能解决你的问题,请参考以下文章
Excel中有日期(一年365天)、时间(一天24小时)、风速、风向、温度、辐照等数据,现在我要计算
R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间