PostgreSQLでtimestamp型の値をタイムゾーンでいじる

こんにちは、さるまりんです。

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:0002022-05-15 12:34:561652618096です。

今度は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:002022-05-15 03:34:562022-05-15 12:34:562022-05-15 03-34-56と9時間マイナスの値で取得されています。

タイムゾーン、いつも混乱してしまいます。
プログラム内でどう利用されているか気をつけないと思いもよらないバグになる可能性も。
何をしているかちゃんと理解していきます。

読んでくださってありがとうございました。

それではまた!