5

私は Postgresql のタイムゾーンに頭を悩ませようとしていますが、これを理解できないようです。EST はアメリカの「東部標準時」で、通常はUTC-5です。

例 1: ベース テスト

select '08/31/2011 12:00 pm EST'::timestamptz  at time zone 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00

例 2: オフセットは +5

select '08/31/2011 12:00 pm EST' at time zone '+5';
      timezone       
---------------------
 2011-08-31 12:00:00

例 3: オフセットは -5

 select '08/31/2011 12:00 pm EST' at time zone '-5';
      timezone       
---------------------
 2011-08-31 22:00:00

明らかに、すべてが後退しています。EST は再び... UTC-5 であるはずです。今、私はドキュメントを検索しましたが、物事が「POSIX」であり、後方にあることを説明しています。(正のオフセットは GMT の西、負のオフセットは GMT の東です)。

しかし、どうすればこれを回避できますか?アプリケーション層では、いつでも + 記号を - 記号に反転できますが、IMO には少し面倒です。したがって、私の究極の質問です。

データベース層 (Postgres) で、GMT-5 が EST に対応するように「At Time Zone」構文を使用する方法はありますか? それとも、アプリケーション層ですべてを反転する必要がありますか?

4

1 に答える 1

3

適切な動作を得るには、ドキュメントに記載されている間隔データ型を使用します。

これらの式では、目的のタイム ゾーンzoneをテキスト文字列 ('PST' など) または間隔(INTERVAL '-08:00' など) として指定できます。

ベーステスト:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)

タイムゾーン情報:

SELECT * FROM pg_timezone_abbrevs WHERE abbrev LIKE 'EST';
 abbrev | utc_offset | is_dst 
--------+------------+--------
 EST    | -05:00:00  | f
(1 row)

適切なオフセット -5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '-05:00'::interval;
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)

適切なオフセット +5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '+05:00'::interval;
      timezone       
---------------------
 2011-08-31 22:00:00
(1 row) 
于 2011-08-19T10:38:05.017 に答える