2012-12-19 55 views
1

在postresql服務器9.1.4上的OSX 10.8是一個意外的行爲。 由於在Ubuntu 12.04上它是正確的。OSX postgres 9.1.4帶時區順序的時間戳

要重現此問題,請使用以下postgres sql示例數據庫。 注意: 時間戳值在歐洲/柏林時區選擇,時間戳在2012的DST末端附近,這是本次測試的情況。

BEGIN; 
DROP TABLE data; 
CREATE TABLE data (
"id" int8 NOT NULL, 
"timestampwithtimezone" timestamp(6) WITH TIME ZONE, 
CONSTRAINT "data_pkey" PRIMARY KEY ("id") 
); 
COMMIT; 

BEGIN; 
INSERT INTO data (id, timestampwithtimezone) VALUES (205,'2012-10-28 01:30:00+02'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (204,'2012-10-28 02:00:00+02'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (203,'2012-10-28 02:30:00+02'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (202,'2012-10-28 02:59:59+02'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (106,'2012-10-28 02:00:00+01'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (107,'2012-10-28 02:30:00+01'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (108,'2012-10-28 02:59:59+01'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (109,'2012-10-28 03:00:00+01'); 
INSERT INTO data (id, timestampwithtimezone) VALUES (110,'2012-10-28 03:30:00+01'); 
COMMIT; 

如果我鍵入下面的SQL查詢,只有一個給定的時間戳之前尋找最後存在的時間戳:

SELECT id, timestampwithtimezone at time zone 'Europe/Berlin' as timestampwithtimezone 
FROM data 
WHERE 
timestampwithtimezone at time zone 'Europe/Berlin' 
< cast('2012-10-28T02:30:00.000+01' AS timestamp) 
ORDER BY timestampwithtimezone DESC 
LIMIT 1; 

我預期的結果是:

║106║2012 -10-28 02:00:00║

由於我想在給定(2012-10-28T02:30:00.00)之前的最後一個時間戳0 + 01)時間戳。 但結果包括:

║║204 02:00:00 2012年10月28日║

似乎postgresqls排序是錯誤在這種情況下。 Ubuntu下我找到正確答案,這是ID:106和NOT 204

但是:

如果我成立這個查詢:(唯一的區別就是我放棄了結果集映射到時區):

SELECT id, timestampwithtimezone 
FROM data 
WHERE timestampwithtimezone at time zone 'Europe/Berlin' 
< cast('2012-10-28T02:30:00.000+01' AS timestamp) 
ORDER BY timestampwithtimezone DESC 
LIMIT 1; 

結果在OSX 10.8設定作爲在Ubuntu 12.04預期以及:

║106║2012年10月28日02:00:00 + 01║

爲什麼有一個OS版本之間的區別? 而在這種情況下對這個查詢的回答'204'確實是錯誤的。 但是,如果將時間戳映射到時區,爲什麼結果集中存在差異?就我所知,postgresql在內部使用UTC來存儲時間戳。所以DST在時間軸上應該不是問題。 爲什麼會發生這種情況?

預先感謝您的回覆。

回答

1

先前的答案是錯誤的。

根據你的數據。兩個答案都很好。

2012-10-28從夏令時到冬令時(Here it is explained)有時間變化。

看小時這個結果:

select id, 
    timestampwithtimezone, 
    timestampwithtimezone at time zone 'Europe/Berlin' as berlin 
from data 
order by berlin ; 


id | timestampwithtimezone |  berlin   
-----+------------------------+--------------------- 
205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 
203 | 2012-10-28 02:30:00+02 | 2012-10-28 02:30:00 
202 | 2012-10-28 02:59:59+02 | 2012-10-28 02:59:59 

記錄ID爲204和106具有在柏林列中的相同的值。

閱讀來自here的問題和解答。

如果您想通過timestamptz訂購不使用別名列同名

SELECT 
    id, 
    timestampwithtimezone at time zone 'Europe/Berlin' as timestampwithtimezone_alias 
FROM data 
WHERE 
    timestampwithtimezone at time zone 'Europe/Berlin' 
    < cast('2012-10-28T02:30:00.000' AS timestamp) 
ORDER BY timestampwithtimezone DESC 
LIMIT 1; 
相關問題