プログラミング
Postgresの「at time zone 'UTC'」におけるフットガン
Footguns with Postgres “at time zone 'UTC'” (bookofrevenue.com)
要約
PostgreSQLのタイムゾーン機能、「at time zone 'UTC'」は、直感に反する動作をすることがあります。この機能は、指定されたタイムゾーン(この場合はUTC)に変換するのではなく、指定されたタイムゾーンを「解釈」して、そのタイムゾーンのローカル時刻として扱おうとします。これにより、意図しない結果やデータ破損につながる可能性があるため、注意が必要です。
全文翻訳
PostgreSQLのタイムゾーン機能、「at time zone 'UTC'」は、直感に反する動作をすることがあります。
この機能は、指定されたタイムゾーン(この場合はUTC)に変換するのではなく、指定されたタイムゾーンを「解釈」して、そのタイムゾーンのローカル時刻として扱おうとします。
たとえば、PostgreSQLのサーバーがUTCで実行されているとします。
SELECT NOW() AT TIME ZONE 'UTC';
これは、現在のUTC時刻を返します。
しかし、サーバーがUTC以外のタイムゾーンで実行されている場合、たとえば「America/Los_Angeles」で実行されている場合、次のようになります。
SELECT NOW() AT TIME ZONE 'UTC';
これは、現在の「America/Los_Angeles」のローカル時刻を返します。
これは、PostgreSQLが「at time zone」句を、指定されたタイムゾーンに変換するのではなく、指定されたタイムゾーンを「解釈」して、そのタイムゾーンのローカル時刻として扱おうとするためです。
これは、意図しない結果やデータ破損につながる可能性があるため、注意が必要です。
PostgreSQLのタイムゾーン機能の正しい動作を理解するには、公式ドキュメントを参照することをお勧めします。