2016-10-03 157 views
0

我想測試時區和時區與時區的差異。但我遇到了一些我不明白爲什麼它會這樣工作的東西。存儲/檢索帶時區或不帶時區的時間戳

我有以下設置:

CREATE TABLE tbl_test_timezones (
    first_date timestamp with time zone, 
    second_date timestamp 
) 

我已經插入了一些TESTDATA:

insert into tbl_test_timezones (first_date, second_date) values (now(), now()); 

現在我想檢查這兩個領域之間的差異時,我做了選擇

select 
    first_date, 
    first_date at time zone 'Europe/Brussels' as first_date_wt, 
    second_date, 
    second_date at time zone 'Europe/Brussels' as second_date_wt 
from tbl_test_timezones 

which gives me the following result 

first_date:  2016-10-03 07:03:16.63818+00  
first_date_wt: 2016-10-03 09:03:16.63818 
second_date: 2016-10-03 07:03:16.63818 
second_date_wt: 2016-10-03 05:03:16.63818+00 

問題1

我想知道爲什麼second_date_wt正在做-2而不是+2像first_date_wt?

問題2

比方說,我的應用程序商店與時區的時間戳和用戶想要得到一些記錄這個時間戳。您是否需要爲用戶輸入自己的時區來存儲某種用戶設置,並在檢索時將其包含在選擇查詢中?或者你更喜歡獲取它並在客戶端應用程序中執行時區內容?

例如:

select start_date at time zone (
    select user_time_zone from tbl_user_settings where user_id = 2 
) 
from tbl_projects 

或只做

select start_date 
from tbl_projects 

回答

1

回答問題1

這兩個值有不同的含義。

first_date AT TIME ZONE 'Europe/Brussels' 

答案:在這個時間點布魯塞爾的掛鐘是什麼?

second_date AT TIME ZONE 'Europe/Brussels' 

答案:布魯塞爾的掛鐘在什麼時間顯示這個值?

回答問題2

要做到這一點,最好的辦法是由配置參數設置TimeZone到客戶端應用程序的時區。然後,所有timestamp with time zone值將在這個時區顯示,並timestamp without time zone值將在該時區被解釋爲價值觀:

SHOW TimeZone; 

    TimeZone 
--------------- 
Europe/Vienna 
(1 row) 

SELECT 
    TIMESTAMP WITH TIME ZONE '2016-10-01 00:00:00 UTC' AS "midnight at UTC", 
    CAST(
     TIMESTAMP WITHOUT TIME ZONE '2016-10-01 00:00:00' 
     AS TIMESTAMP WITH TIME ZONE 
    ) AS "midnight local"; 

    midnight at UTC  |  midnight local 
------------------------+------------------------ 
2016-10-01 02:00:00+02 | 2016-10-01 00:00:00+02 
(1 row) 

SET TimeZone = 'America/Los_Angeles'; 

SELECT 
    TIMESTAMP WITH TIME ZONE '2016-10-01 00:00:00 UTC' AS "midnight at UTC", 
    CAST(
     TIMESTAMP WITHOUT TIME ZONE '2016-10-01 00:00:00' 
     AS TIMESTAMP WITH TIME ZONE 
    ) AS "midnight local"; 

    midnight at UTC  |  midnight local 
------------------------+------------------------ 
2016-09-30 17:00:00-07 | 2016-10-01 00:00:00-07 
(1 row) 
+0

答案的第一個問題是一個簡單的方法來記住的區別,謝謝!也不知道你可以用SET關鍵字設置時區。大!但是當你的客戶位於不同的時區時,你會做什麼?你是否總是對每個查詢執行SET TIMEZONE = xxxxx? – koala

+0

如果一個會話需要在不同時區(如連接池中)爲客戶提供服務,則每次切換客戶時都必須設置時區。但是如果您在應用程序代碼中處理時區,則必須在應用程序中執行相同的操作,對嗎? –

+0

在我的情況下,我有一個REST API,客戶端也可以連接。因此,如果我將時間戳存儲爲「帶時區的時區」並獲取數據,則只需將客戶端應用程序設置爲正確的時區以顯示正確的時間,對不對?不需要我的後端知道最終用戶在哪個時區? – koala