C# で Npgsqlを使ってtimestamp with time zoneのデータをinsertしていて、
– クライアントソフト側のTimeZoneはちゃんとTokyo
– 引数で渡す時刻もちゃんとしている(型はDateTime)
– PostgreSQLのTimeZoneもTokyo(show timezone; で確認できる)
なのに、insertされた結果が9時間進んでいるという謎現象が起きて、しばらくはまったのでメモ。
https://www.npgsql.org/doc/types/datetime.html
を読むと、
A common mistake is for users to think that the PostgreSQL timestamp with time zone type stores the timezone in the database.
って書いてあって、私のつたない英語力では、
「timestamp with timezoneはデータベースにtimezoneが保存されているといったな。あれはウソだ」(超意訳)
って衝撃の言葉と読める。
さらに
「NpgsqlDbType.TimestampTzを指定してローカルタイムゾーンなDateTimeなデータを送ると、送信する前に問答無用でタイムゾーンをUTCに変えちゃうもんね」
とかいう恐ろしい呪いの言葉が書かれている。
うそでしょ?
そんなことある?
と思いましたが目の前のテーブルには正確に9時間ずれたデータ。
とりあえず
NpgsqlDbType.Timestamp を使え
ということだそうです。