PostgreSQLで前月、当月、翌月の月初日を取得する&月末も

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

タイトルにあるように月初日を取得していきます。

当月月初はこれです。

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で同じことをやってみたいと思います。

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