PostgreSQLでUNIX時間からタイムスタンプへ、タイムスタンプからUNIX時間への変換

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

以前、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でいけるようです。

タイムスタンプのタイムゾーン問題、難しいです。
頭の中がこんがらがります。
ちゃんと実験してから使うように気をつけます。

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

それではまた!