こんにちは、さるまりんです。
以前、UNIXエポックからのミリ秒を日時の文字列に変換するのはやりました。
今回はタイトルにあるようにPostgreSQLでUNIX時間とTimestampの間で変換する方法をメモしておきます。
UNIX時間からタイムスタンプへ
まずはUNIX時間からタイムスタンプへです。
これは簡単でto_timestamp()関数を使うことでできます。
select to_timestamp(1713133800);
こんな感じです。
salu=> select to_timestamp(1713133800);
to_timestamp
------------------------
2024-04-15 07:30:00+09
(1 row)
UTC1970年1月1日午前0時0分0秒(UNIXエポック)以前でも以下のように変換されます。
負の数で秒数を渡します。
select to_timestamp(-156507285);
こうなります。
salu=> select to_timestamp(-156507285);
to_timestamp
------------------------
1965-01-15 22:45:15+09
(1 row)
タイムスタンプからUNIX時間へ
今度は逆、タイムスタンプからUNIX時間へです。
こちらはこんな風にします。
select extract(epoch from timestamp '2024-04-15 07:30:00');
salu=> select extract(epoch from timestamp '2024-04-15 07:30:00');
date_part
------------
1713166200
(1 row)
あれ?ズレてますね。上では1713133800
でした。
1713166200
をタイムスタンプに戻すと
salu=> select to_timestamp(1713166200);
to_timestamp
------------------------
2024-04-15 16:30:00+09
(1 row)
9時間の差、タイムゾーンの差でズレが出ているようです。
ちょっと変えてみます。
salu=> select extract(epoch from timestamptz '2024-04-15 07:30:00');
date_part
------------
1713133800
(1 row)
timestamp
の代わりにtimestamptz
でいけるようです。
タイムスタンプのタイムゾーン問題、難しいです。
頭の中がこんがらがります。
ちゃんと実験してから使うように気をつけます。
読んでくださってありがとうございます。
それではまた!