@m_seki の

I like ruby tooから引っ越し

PostgreSQLのtimezone設定メモ

PostgreSQLのtimezoneを設定したいメモ

HerokuのPgが標準時モードであることに気づいたので設定することにした。 とりあえずローカルなPgで実験。

まず、現在のtimezoneを確認

% psql hoge   
psql (14.10 (Homebrew), server 14.2)
Type "help" for help.

hoge=# show timezone;
 TimeZone 
----------
 Etc/UTC
(1 row)

hoge=# select current_timestamp;
       current_timestamp       
-------------------------------
 2024-01-23 12:23:35.162853+00
(1 row)

UTCで+00だ。これを変更して、一度クライアントを終了する。

hoge=# alter database hoge set timezone to 'Asia/Tokyo';
ALTER DATABASE
hoge=# \q

psqlを再び起動して確認する。

% psql hoge   
psql (14.10 (Homebrew), server 14.2)
Type "help" for help.

hoge =# select current_timestamp;
       current_timestamp       
-------------------------------
 2024-01-23 21:28:09.199852+09
(1 row)

うまくできた。

あとでHerokuでもやっておかなくちゃ。heroku psqlで同じ設定をして、アプリを再起動すればよいのだろう、たぶん。

PostgreSQLの時刻型

そうか。timestamp型にはtimezoneありとなしがあるのか。ぐぬぬ。今回は標準SQLなtimestamp型にしてしまった。

timestamp 日付と時刻、タイムゾーンなし
timestamp with time zone 日付と時刻、タイムゾーンあり
time 時刻、タイムゾーンなし
time with time zone 時刻、タイムゾーンあり

with timezoneじゃなくてwith time zone(スペースあり)なんだな。

追記:Herokuで操作したぞ

% heroku psql
...
hoge::DATABASE=> select current_database();
 current_database 
------------------
 hogehoge
(1 row)

hoge::DATABASE=> select current_timestamp;
       current_timestamp       
-------------------------------
 2024-01-26 09:41:32.008282+00
(1 row)

hoge::DATABASE=> show timezone;
 TimeZone 
----------
 Etc/UTC
(1 row)

hoge::DATABASE=> alter database hogehoge set timezone to 'Asia/Tokyo';
ALTER DATABASE

hoge::DATABASE=> \q

一度切断してから再接続して確認する

hoge::DATABASE=> show timezone;
  TimeZone  
------------
 Asia/Tokyo
(1 row)

hoge::DATABASE=> select current_timestamp;
       current_timestamp       
-------------------------------
 2024-01-26 18:42:39.714086+09
(1 row)

あれれ?うまくいかない...あ!アプリの再起動が必要だった。

% heroku restart

うまくいきました。