2016-12-01 121 views
0

我的控制檯是PST。 數據庫服務器和存儲的時間是GMT。特定時區的索引時間戳

我不必像這樣運行查詢:

SELECT x,y,z 
FROM tbl_msg 
WHERE (msg_datetime AT TIME ZONE 'BST') BETWEEN '2016-11-21'::date and '2016-11-22'::date; 

索引101表示,在msg_datetime執行此操作,現在將避免指數,這是我所看到的。

所以我需要一個索引解決方案的建議。

我可以索引這個時區嗎?或改變這個查詢,以便它在BST中查詢這些時間,轉換爲GMT?

回答

0

您應該有msg_datetimetimestamp with time zone(或更短的別名timestamptz)與正常的索引。

然後,爲了獲取數據,這2天,你應該:

set timezone 'Europe/London'; -- once, on connection start 
SELECT x,y,z 
FROM tbl_msg 
WHERE 
    msg_datetime>='2016-11-21 00:00:00' 
    and 
    msg_datetime<'2016-11-23 00:00:00'; 

你不應該使用普通timestamp,因爲它存儲字面日期和時間沒有有關哪些時區,它實際上的意思。一個timestamp with time zone類型會自動將客戶端配置的時間轉換爲內部表示(使用UTC)並返回。您還可以使用例如'2016-11-23 00:00:00 Asia/Tokyo'從非默認時區表示時間戳。

此外,您不應該使用BST - 因爲您需要在冬天使用GMT並記住何時使用哪個。您應該使用「歐洲/倫敦」或其他「城市」時區(list),夏季和冬季都適用。

+0

這是有趣的設置連接時區。我只看到了「AT TIME ZONE'XXX'」。 這可能是答案,它允許我在BST時間傳遞並將其轉換爲GMT/UTC,而不必將GMT/UTC轉換爲BST。 –

+0

我看到你提到不使用BST。這就是我必須像這樣施放的全部原因。用戶是BST,並且想要使用BST術語在應用程序中進行搜索。 這就是爲什麼我將數據轉換爲不同的時區,因爲我們需要允許發生時區感知轉換,因此如果需要,需要考慮該小時 –

+0

您錯了 - 您沒有BST用戶。你可能有「歐洲/倫敦」用戶,它使用BST時區(UTC + 1)半年(因爲它不是今天,因爲它在北半球是冬天),以及另一個半年(與今天一樣)的GMT時區。例如,您可能會使用夏季使用CEST(UTC + 2)和冬季使用CET(也是UTC + 1)的「歐洲/華沙」客戶端。 – Tometzky