我确定标题可能会令人困惑。无法找到一种方法来在标题中很好地说出这一点,而不会使其长度为非常长。无论夏令时如何,只在UTC 2:00检索时间戳(带时区)行的SQL查询
在短期
我有存档外部API端点每15分钟一个PSQL数据库表。该表具有以下的列:
- ID(串行)
- 比赛(jsonb)
- snapshot_time(时间戳和时区不为空默认NOW())
我需要一个SQL只能在以下约束下获取行的查询:
- 一天必须星期六(6)
- 时间戳必须在'... T02:00:00Z'ISO8601
- 在指定的开始和结束日期之间。
我现在有
SELECT id,snapshot_time,match->'kills' FROM match_archive
WHERE extract(dow from snapshot_time)=6
AND snapshot_time >= '2016-12-01'
AND date_part('hour', snapshot_time)=2
AND date_part('minute', snapshot_time)=00;
(开始&结束时间,目前很难在例如编码)
的问题
这将返回正确的行,但问题是自snapshot_time
列以来的结果行是因为我住在东部标准时间,所以timestamp with time zone
型实际上是5个小时。
它返回一个例子行
id | snapshot_time | ?column?
--------+-------------------------------+--------------------------------------------
120941 | 2016-12-03 02:00:03.32946-05 | {"red": 3389, "blue": 1962, "green": 2911}
正如你所看到的,snapshot_time确实是2:00,但它在美国东部时间。
我想,“嘿,我可以让它的小时:21,星期几:5(星期五)”,这样就行得通了,但突然间由于夏令时将在一个小时后关闭。
其他的事情将使用timestamp without time zone
来存储信息,但会发生什么,然后是它会采取2016-12-03T17:44:21-05
,只是砍掉-05
并把它作为2016-12-03T17:44:21Z
插入新行到数据库时。
那么,有没有什么好方法可以让SQL查询符合上面列出的要求而不必担心夏令时?谢谢。
虽然我意识到您可能没有这个选项,但理解最佳做法是始终将UTC中的日期时间数据存储在首位。如果这样做了,这个问题就不会出现。即使是现在,如果我有选择,我会认真研究将数据库中的所有现有本地时区日期时间数据(以及从其驱动的代码)转换为UTC。 –
@CharlesBretana存储UTC时区甚至不是PostgreSQL中的选择。这就是它们的存储方式。 –
我没说店时区,我说在UTC存储日期倍。然而,我承认我不熟悉PostgreSQL。你是说你无法控制你存储在PostGreSQL表的日期时间列中的值吗?客户端软件无法存储UTC值而不是本地时间值? –