我確定標題可能會令人困惑。無法找到一種方法來在標題中很好地說出這一點,而不會使其長度爲非常長。無論夏令時如何,只在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值而不是本地時間值? –