こんにちは、さるまりんです。
PostgreSQLのtimestamp型カラムでタイムゾーンがらみで悩んだのでその時の確認メモです。
まずはPostgreSQLデータベースのタイムゾーンを確認します。
次のコマンドを実行です。
show timezone;
postgres=# show timezone;
TimeZone
----------
Etc/UTC
(1 row)
Etc/UTC
、UTCですね。
Etcは「その他」です。タイムゾーンは地域/場所(Asia/Tokyoみたいに)と表記するのですが、UTCはどこの地域にも属していないのでEtc(その他)で表示されているようです。
ではテーブルを作成し、値を入れてみます。
timestamp型のカラムtsひとつをもつテーブルsome_timesを作成し
postgres=# create table some_times (
postgres(# ts timestamp not null
postgres(# );
CREATE TABLE
二つのデータを登録します。
postgres=# insert into some_times (ts) values
postgres-# ('1970-01-01 00:00:00'),
postgres-# ('2022-05-15 12:34:56');
INSERT 0 2
内容を確認してみます。
postgres=# select ts from some_times;
ts
---------------------
1970-01-01 00:00:00
2022-05-15 12:34:56
(2 rows)
insert
した値がそのまま登録されています。
この値はUTCでの値です。
1970年1月1日0時0分0秒からの秒数で取得してみます。
取得するには
extract(epoch from [タイムスタンプ])
です。
postgres=# select extract(epoch from ts) from some_times;
date_part
------------
0
1652618096
(2 rows)
1970-01-01 00:00:00は0、2022-05-15 12:34:56は1652618096です。
今度はJST、日本標準時として取得してみます。
変換するには
[タイムスタンプ] at time zone 'タイムゾーン'
です。
postgres=# select ts at time zone 'JST' from some_times;
timezone
------------------------
1969-12-31 15:00:00+00
2022-05-15 03:34:56+00
(2 rows)
UTCとJSTでは9時間の差があるので
1970-01-01 00:00:00は2022-05-15 03:34:56、2022-05-15 12:34:56は2022-05-15 03-34-56と9時間マイナスの値で取得されています。
タイムゾーン、いつも混乱してしまいます。
プログラム内でどう利用されているか気をつけないと思いもよらないバグになる可能性も。
何をしているかちゃんと理解していきます。
読んでくださってありがとうございました。
それではまた!