タイムゾーンがJSTじゃないDBでの注意

HerokuのpostgreSQLアドオン等はリージョンが海外となるため、JSTとなっているDBサーバーでは問題ないSQLが異なる結果となってしまう場合がある。

単純に

select now(), current_timestamp;

とした場合、2つの結果はクライアントソフトが勝手に日本時間に補正して表示しているため、問題ないように見える。

しかし、to_char()関数を使って日付を文字列に変換する際、この処理はDB側で行われるため、変換結果が意図した結果(日本時間)にならない場合がある。

-- 例
select to_char(now(), 'YYYY/MM/DD HH24:MI:SS'), to_char(current_timestamp, 'YYYY/MM/DD HH24:MI:SS');

以下のようにすれば日本時間として計算した結果が得られる。

select to_char(now() at time zone 'JST', 'YYYY/MM/DD HH24:MI:SS'), to_char(current_timestamp at time zone 'JST', 'YYYY/MM/DD HH24:MI:SS');