【问题标题】:How do I group SQLITE records by date, allowing for the timezone?如何按日期对 SQLITE 记录进行分组,允许时区?
【发布时间】:2021-07-03 10:06:02
【问题描述】:

我在 PHP 中使用 SQLITE 从包含 Unix 时间作为数字的数据库中按日期生成记录摘要,但它似乎没有为时区正确拆分记录。

我先把PHP时区设置为GMT+8:

date_default_timezone_set ("Asia/Makassar");

然后我做这个 SQLITE 查询:

SELECT DATE([datetime],'unixepoch', 'localtime') AS [date], COUNT (*) AS [number],  SUM([duration]) AS [ds], MAX ([peak]) AS [pm], SUM ([total]) AS [ts] from $table WHERE datetime >= $period_start and datetime <= $period_end GROUP BY [date] 

2021-07-02 没有记录,2021-07-03 有 11 条记录。他们在这里:

Time        duration total  peak
04:23:33    9:14    0.34    6.2
04:36:07    4:30    0.14    14.1
05:14:17    7:39    0.4     13.9
05:24:26    16:40   2.34    26.9
05:41:35    5:59    0.43    43.7
05:49:48    6:34    0.13    8
06:03:16    16:22   3.09    61.6
06:31:21    3:15    0.03    9
06:40:25    12:15   1.98    51.8
06:56:46    4:24    0.09    11.2
13:03:01    3:27    0.04    14.6

...这是我从 SQLITE 查询中得到的摘要:

Date        No  Dur     Total   Peak
2021-07-01  2   7:21    0.08    19
2021-07-02  6   50:36   3.78    44
2021-07-03  5   39:43   5.23    62

如您所见,2003 年 7 月 21 日的前 6 条记录(当地时间早上 6 点之前的记录)已移回前一天。在早上 6 点之前有记录的日子里,这种行为一直发生。

【问题讨论】:

  • 如果从DATE() 中删除'localtime' 会发生什么?
  • @forpas 没有本地时间,情况更糟:摘要显示 2021-07-02 的 10 条记录。
  • 我投票结束这个问题,因为没有解决方案。

标签: php sqlite timezone


【解决方案1】:

您需要通过添加 6 小时来调整时间戳:

DATE([datetime], 'unixepoch', 'localtime', '+6 hour') 

【讨论】:

  • ...知道为什么我需要添加任何东西,为什么特别是六个小时,因为时区偏移量是 8 小时?该更正对其他时区有效吗?明细报表上的时间是使用PHP函数“date('H:i:s', (int) $row['datetime'])”从SQL表中打印出来的,都是正确的。
  • @JavaLatte SQLite 函数如 date() 或 datetime() 返回的结果不受 PHP 设置的影响。他们的结果基于运行查询的系统设置。大约 6 小时:我提议这样做是因为您在问题中提到:这种行为在早上 6 点之前有记录的日子持续发生我没有您的实际数据,而且由于您的时间戳是 unix 时期,我只有从您描述的问题中知道他们需要调整。
  • 你是对的:没有办法设置 SQLITE 使用的时区。我的服务器的时区是 CEST,如果数据来自不同的时区,则无法改变 SQLITE 对此事的看法。了解这些事情的人说,您应该使用应用程序语言(在本例中为 PHP)而不是 SQL 进行时区操作。就我而言,这意味着对每个单独的查询。单身的。天。
  • 添加固定偏移量不起作用,即使对于一个特定的时区:WITA 始终为 +0800,但 CEST 为 +0200,CET 为 +0100,您无法从 SQL 外部知道查询特定记录中的日期是 CEST 还是 CET。
  • @JavaLatte 您将时间戳存储为 unix 时间,这是一个绝对计时系统。您应该知道这些值代表什么。我只建议 +6 小时调整,因为这是您在问题中提到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2018-12-04
  • 2020-05-23
相关资源
最近更新 更多