💽

Postgre SQL で月初と月末を計算する

2024/03/18に公開

Postgre SQL で集計処理を行う処理を実装しています。
与えられた日付から月初と月末を取得したかったのですが、SQL Server でいう EOMONTH 的な関数がないみたいなので自力で計算する処理を作成したのでそのメモです。

結論

  • 月初の取り方: date_trunc() で月初を求める
  • 月末の取り方: 月初から一ヶ月後を求めて一日引く
  • 年始と年末もいけるよ

月初の取り方: date_trunc() で月初を求める

まずは、date_trunc() 関数を使用して、与えられた日付について月単位で切り捨てを行います。

SELECT
    CURRENT_TIMESTAMP,
    date_trunc('month', CURRENT_TIMESTAMP) AS bom
-- -> "2024-03-18 03:31:34.712702+00"	"2024-03-01 00:00:00+00"

参考: https://www.postgresql.jp/document/7.2/user/functions-datetime.html

これで月初は取得することができました。

月末の取り方: 月初から一ヶ月後を求めて一日引く

次は月末を取ります。↑で得られた月初を使います。月初から一ヶ月後を求めて、一日前に戻します。

SELECT
    CURRENT_TIMESTAMP,
    date_trunc('month', CURRENT_TIMESTAMP) AS begining_of_month,
    date_trunc('month', CURRENT_TIMESTAMP) + '1 month' + '-1 day' AS end_of_month
-- -> "2024-03-18 03:35:32.02537+00"	"2024-03-01 00:00:00+00"	"2024-03-31 00:00:00+00"

四則演算的に日付を操作できるのは直感的ですが、文字列で指定する必要があります。
これで、月初と月末を取得することができました。

年始と年末もいけるよ

肝は date_trunc() 関数で最初の日付を取ることです。
切り捨ての範囲を広げれば、この方法で年始と年末も取得することができますね。

SELECT
    CURRENT_TIMESTAMP,
    date_trunc('year', CURRENT_TIMESTAMP) AS begin_of_year,
    date_trunc('year', CURRENT_TIMESTAMP) + '1 year' + '-1 day' AS end_of_year
-- -> "2024-03-18 03:40:51.803202+00"	"2024-01-01 00:00:00+00"	"2024-12-31 00:00:00+00"

最後に

よく使うので FUNCTION にしてもいいかもしれないですね

参考

https://www.postgresql.jp/document/7.2/user/functions-datetime.html
https://db.just4fun.biz/?PostgreSQL/月末を求める方法

Discussion