🥳
PostgreSQL で日付/時刻データ型をいい感じに処理する
こんな 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