こんにちは、さるまりんです。
タイトルにあるように月初日を取得していきます。
当月月初はこれです。
select date(date_trunc('month', current_date));
salu=> select date(date_trunc('month', current_date));
date
------------
2024-01-01
(1 row)
current_date
を使っていますがcurrent_timestamp
でもいけます。
翌月月初はこれです。
select date(date_trunc('month',current_date) + ' 1 month');
salu=> select date(date_trunc('month',current_date) + ' 1 month');
date
------------
2024-02-01
(1 row)
前月月初はこれです。
select date(date_trunc('month',current_date) + ' -1 month');
salu=> select date(date_trunc('month',current_date) + ' -1 month');
date
------------
2023-12-01
(1 row)
ちなみにこれはエラーになります。
salu=> select date(date_trunc('month',current_date) - ' 1 month');
ERROR: invalid input syntax for type timestamp with time zone: " 1 month"
LINE 1: select date(date_trunc('month',current_date) - ' 1 month');
月末日は翌月初日の前日なので、+ '- 1 day'
してあげることでとれます。
それぞれ当月末、翌月末、前月末です。
select date(date_trunc('month',current_date) + ' 1 month' + '-1 Day');
select date(date_trunc('month',current_date) + ' 2 month' + '-1 Day');
select date(date_trunc('month',current_date) + '-1 Day');
実行してみました。
salu=> select date(date_trunc('month',current_date) + ' 1 month' + '-1 Day');
date
------------
2024-01-31
(1 row)
salu=> select date(date_trunc('month',current_date) + ' 2 month' + '-1 Day');
date
------------
2024-02-29
(1 row)
salu=> select date(date_trunc('month',current_date) + '-1 Day');
date
------------
2023-12-31
(1 row)
Timestampのカラムcreated
を持つテーブルaccess_logs
に先月記録されたレコード数をとるselect
をこんなふうに書きました。
select count(*) from access_logs
where created >= date(date_trunc('month',current_date) + ' -1 month')
and created < date(date_trunc('month',current_date) + ' 1 month');
このために月初日の取得の方法を考えていたのでまとめてみました。
次はMySQLで同じことをやってみたいと思います。
読んでくださってありがとうございました。
それではまた!