在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在時間軸上應該不是問題。 爲什麼會發生這種情況?
預先感謝您的回覆。