🥳

PostgreSQL で日付/時刻データ型をいい感じに処理する

2021/11/19に公開

こんな created_at があったとします。

# select created_at from users;
         created_at
----------------------------
 2021-11-18 02:24:36.380139
(1 row)

ケース1: 9時間後の時間にしたい

UTC になってるから JST で知りたい!みたいなときには INTERVAL が便利です。( hour でも hours でも良いみたい)

ここは timezone 付き TIMESTAMP にするとか、DB の timezone を JST にするとか、いろいろありそうですが、INTERVAL のことが書きたかっただけなので優しく読んでください。

# select created_at + INTERVAL '9 hours' AS _created_at_jst from users;
      _created_at_jst
----------------------------
 2021-11-18 11:24:36.380139
(1 row)

INTERVAL ではこういう指定もできます。

指定 意味
interval ‘1 day’ 1日
interval ’2 week’ 2週間
interval ’3 month’ 3ヶ月
interval ‘4 year’ 4年
interval ’09:00′ 9時間
interval ’00:30′ 30分
interval ’00:00:10′ 10秒

ケース2: 型を変換したい

created_at は TIMESTAMP ですが、 CAST を使って型を変換できます。

# select CAST(created_at AS DATE) from users;
 created_at
------------
 2021-11-18
(1 row)

::DATE でも変換できるみたいだけど、これはショートカットっぽい?

::を使用する構文は、PostgreSQLで伝統的に使用されている方法です。
https://www.postgresql.jp/document/13/html/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS

なるほど。

# select created_at::DATE from users;
 created_at
------------
 2021-11-18
(1 row)

ケース3: 年や曜日を取得したい

EXTRACT 関数を使えば、年、月、日、時、分、秒、曜日(0が日曜、6が土曜)をそれぞれ取得できます。(曜日は dow だけどこれは day of week の略なのかな)

# select EXTRACT(year from created_at) AS _year, EXTRACT(dow from created_at) AS _dow from users;
 _year | _dow
-------+------
  2021 |    4
(1 row)

Discussion