[英]SQL Query that only retrieves timestamped (with time zone) rows at 2:00 UTC regardless of Daylight Savings Time
我確定標題可能令人困惑。 如果沒有很長的標題,就找不到找到在標題中表達得很好的方法 。
簡而言之
我有一個PSQL數據庫表,該表每15分鍾存檔一次外部API端點。 該表包括以下列:
我需要一個僅在以下約束下獲取行的SQL查詢:
我目前有什么
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,但它在EST中。
我想,“嘿,我可以把它設為小時:21,星期幾:5(星期五)”,這行得通,但是由於將來的夏令時,突然之間會減少一個小時。
另一件事是使用timestamp without time zone
來存儲信息,但是會發生什么事情呢,這將需要2016-12-03T17:44:21-05
並砍掉-05
並將其保留為2016-12-03T17:44:21Z
在數據庫中插入新行時為2016-12-03T17:44:21Z
。
因此,有沒有什么好方法可以進行SQL查詢,使我可以按照上面列出的要求獲取行,而不必擔心夏時制? 謝謝。
這將返回正確的行,但是問題是,自從我居住在東部標准時間以來,由於snapshot_time列的類型為帶有時區的timestamp類型的結果行實際上就關閉了5個小時。
根據文檔 ,時間戳始終存儲在PostgreSQL中的UTC中。
對於帶時區的時間戳,內部存儲的值始終以UTC(通用協調時間,通常稱為格林威治標准時間,GMT)表示。 使用該時區的適當偏移量,將指定了明確時區的輸入值轉換為UTC。 如果在輸入字符串中未指定時區,則假定該時區位於系統的TimeZone參數指示的時區中,並使用時區時區的偏移量轉換為UTC。
當輸出帶有時區值的時間戳時, 總是將其從UTC轉換為當前時區,並在該時區中顯示為本地時間。 要查看另一個時區的時間,請更改時區或使用AT TIME ZONE構造 (請參見第9.9.3節 )。
如果有人在Google上遇到此問題,請回答我的問題。
按照Evan Carroll的回答,以下SQL修復了我的問題:
SELECT id,snapshot_time,match->'kills' FROM match_archive
WHERE extract(dow from snapshot_time AT TIME ZONE 'UTC')=5
AND snapshot_time >= '2016-12-01'
AND date_part('hour', snapshot_time AT TIME ZONE 'UTC')=2
AND date_part('minute', snapshot_time AT TIME ZONE 'UTC')=00;
分鍾date_part上可能不是必需的,但是要保持一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.