2015-05-01 91 views
3

我真的需要存儲本地日期和時間(飛機輪子的日期和時間)和utc偏移量,所以我可以轉換爲utc來計算間隔(飛行時間)。人們在當地時間旅行,你需要utc進行跨時區計算。我曾希望使用時間戳,但它絕對是而不是爲此工作。它將一切轉換爲postgres時區的功能。在我的情況下,這是yyyy-dd-mm hh:mi:ss-07PostgreSQL時間戳和時間函數

但是,我調查timetz只是爲了涵蓋所有的基礎。它存儲我所需要的。它將偏移量提供給utc,同時保留當地時間。除了現在我需要兩列而不是一個來存儲信息。

我的問題是: 爲什麼timestamptz和timetz函數會給出不同的結果? 有沒有辦法使timestamptz包括本地時區偏移量而不是系統時區偏移量? 下面是說明差異的疑問:

select cast('2015-05-01 11:25:00 america/caracas' as timestamptz) 

-- 2015-05-01 08:55:00-07 
; 

select cast('2015-05-01 11:25:00 america/caracas' as timetz) 

-- 11:25:00-04:30 
; 

回答

1

我個人覺得想了解PostgreSQL的timestamptz當混亂的措辭timestamp with time zone,因爲它沒有存儲任何時區。根據the docs:

所有支持時區的日期和時間均以UTC格式存儲。在顯示給客戶端之前,它們將轉換爲由TimeZone配置參數指定的區域中的本地時間。

請注意,在該頁面上,timestamptimestamptz的存儲特性和限制是相同的。在我的腦海中,爲了保持筆直,我將timestamptz翻譯爲「真實世界中的時間戳」,並將timestamp明確地翻譯爲「您可能不想使用此類型」(因爲到目前爲止,我已經才發現自己需要存儲的時間戳是與現實世界)

這樣:

爲什麼在timestamptztimetz功能給出不同的結果?

這似乎是因爲PostgreSQL沒有感到他們被允許做出這樣timestamptztimetz工作做:

類型time with time zone由SQL標準定義,但定義方面會導致性能可疑的有用性。

我的猜測是,這些「屬性」中的一些是他們不喜歡的,而你確實這樣做。

和:

有沒有一種方法,使timestamptz包括本地時區偏移而非系統時區偏移?

對於timestamptz值,沒有存儲偏移量。他們只是現實世界的時間戳。因此,存儲本地時區的方式是您已經想到的方式:分開存儲。

create table my_table (
    happened timestamptz, 
    local_time_zone varchar 
); 
select happened at time zone 'UTC', happened at time zone local_time_zone 
    from my_table; 
+0

>>沒有爲timestamptz值存儲偏移量。他們只是現實世界的時間戳。 實際上存在一個偏移量;它是postgres位置設置的偏移量。在我的例子中,它是-7,因爲我的位置恰好在PDT中。 我仍然感到困惑。他們爲什麼打擾?爲什麼不把它存儲爲UTC並用它來完成?如果我想知道飛機從加拉加斯起飛的時間,我認爲沒有必要知道postgres實施的設置的偏移量。 – silves

+0

我的第一個引用來自我關聯的文檔以回答所有這些問題;再讀一遍。他們*做*只是將其存儲爲UTC。當*以默認方式*轉換爲字符串時,它會在PDT中顯示它。這不是存儲在它。 –

+0

我很困惑。西雅圖的時間是4:54,紐約的時間是7:54,倫敦是11:54。 – silves