SQLite 按本地时间日期分组

SQLite group by localtime date

我正在存储具有时区偏移的日期,我想使用 group by 查询按当地时间而不是 UTC 进行分组。以下是日期存储方式的示例:

sqlite> CREATE TABLE t1 (datecol TEXT);
sqlite>
sqlite> INSERT INTO t1 (datecol) VALUES ('2022-01-24T22:00:00-07:00');
sqlite> INSERT INTO t1 (datecol) VALUES ('2022-01-24T23:00:00-07:00');
sqlite> INSERT INTO t1 (datecol) VALUES ('2022-01-25T00:00:00-07:00');
sqlite> INSERT INTO t1 (datecol) VALUES ('2022-01-25T01:00:00-07:00');
sqlite>
sqlite> SELECT DATE(datecol),COUNT(*) FROM t1 GROUP BY DATE(datecol);
2022-01-25|4

我想看的是:

sqlite> SELECT DATE(datecol),COUNT(*) FROM t1 GROUP BY DATE(datecol);
2022-01-24|2
2022-01-25|2

我意识到执行此操作的一种方法是手动减去时区偏移量(在本例中为 7 小时)。但这会有一个缺点,即它不适用于夏令时。

sqlite> SELECT DATE(datecol,'-7 hours'),COUNT(*) FROM t1 GROUP BY DATE(datecol,'-7 hours');

您可以将 localtime 修饰符添加到 date 函数:

SELECT date(datecol, 'localtime') AS localdate, count(*)
FROM t1 GROUP BY localdate;

参见 https://www.sqlite.org/lang_datefunc.html for details, including the "Caveats And Bugs" 部分。

但通常建议在 SQLite 中始终将时间戳存储为 UTC,因为这是默认设置,并且使事情变得更容易。

因此您可以使用

将当前时间戳转换为 UTC
UPDATE t1 SET datecol=datetime(datecol);