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);
我正在存储具有时区偏移的日期,我想使用 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,因为这是默认设置,并且使事情变得更容易。
因此您可以使用
将当前时间戳转换为 UTCUPDATE t1 SET datecol=datetime(datecol);