PostgreSQLでエポックミリ秒を日時の文字列に変換する方法

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

PostgreSQLのテーブルでとあるものの利用開始日時と終了日時がエポックミリ秒で格納されているテーブルがありました。
クエリで取得してみるとこんな感じです。

salu=> select start_timestamp, end_timestamp from usage_periods limit 10;
 start_timestamp | end_timestamp 
-----------------+---------------
   1631286000000 | 1632927600000
   1630422000000 | 1632927600000
   1630767600000 | 1630854000000
   1617548400000 | 1617634800000
   1615734000000 | 1618412340000
   1622532713000 | 1625556733000
   1626060296439 | 1635606000000
   1623722071986 | 1907632484000
   1630854000000 | 1725807600000
   1630767600000 | 1633013940000
(10 rows)

が、これいつなの?とパッと見わからないです。

これを見た目でわかるように取得したいです。

そんな時はこうします。

to_char(to_timestamp([ミリ秒のデータ]/1000.0), '[書式の文字列]')

まず、カラムがミリ秒なので1000で割ります。そしてそれをtimestampにして、指定のフォーマットで文字列にします。
エポック秒なら1000で割る必要はありません。

こんな感じです。
上の結果をyyyy/mm/dd hh:mm:ssの文字列で取得しています。

salu=> select to_char(to_timestamp(start_timestamp / 1000.0), 'YYYY/MM/DD HH24:MI:SS') as start_dt, to_char(to_timestamp(end_timestamp / 1000.0), 'YYYY/MM/DD HH24:MI:SS') as end_dt from usage_periods limit 10;
      start_dt       |       end_dt        
---------------------+---------------------
 2021/09/10 15:00:00 | 2021/09/29 15:00:00
 2021/08/31 15:00:00 | 2021/09/29 15:00:00
 2021/09/04 15:00:00 | 2021/09/05 15:00:00
 2021/04/04 15:00:00 | 2021/04/05 15:00:00
 2021/03/14 15:00:00 | 2021/04/14 14:59:00
 2021/06/01 07:31:53 | 2021/07/06 07:32:13
 2021/07/12 03:24:56 | 2021/10/30 15:00:00
 2021/06/15 01:54:31 | 2030/06/14 01:54:44
 2021/09/05 15:00:00 | 2024/09/08 15:00:00
 2021/09/04 15:00:00 | 2021/09/30 14:59:00
(10 rows)

これだとパッと見て「いつ」かわかりますね。

コンピュータで扱いやすい形と人にとって優しい形、それを橋渡しできるのがプログラム。
どちらにも優しいプログラマを目指して頑張ります。

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

それではまた!