postresql サーバー 9.1.4 上の OSX 10.8 では、予期しない動作です。Ubuntu 12.04以降は正しかった。
この問題を再現するには、次の 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 ║</p>
特定の (2012-10-28T02:30:00.000+01) タイムスタンプの前の最後のタイムスタンプが必要なので。ただし、結果には次のものが含まれます。
║ 204 ║ 2012-10-28 02:00:00 ║</p>
この場合、postgresqls のソートが間違っているようです。Ubuntu では、id: 106 であり、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 ║</p>
OS のバージョンに違いがあるのはなぜですか? そして、この場合のこのクエリに対する答え '204' は本当に間違っています。しかし、タイムスタンプをタイムゾーンにマップすると、結果セットに違いが生じるのはなぜでしょうか? 私の知る限り、postgresql は内部的に UTC を使用してタイムスタンプを保存します。したがって、DST はタイムラインの問題ではありません。なぜこれが起こるのですか?
返信をお待ちしております。