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

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

以前、PostgreSQLで月初、月末日を取得する方法を書きました。
今回は同じことをMySQLでやってみます。

まずは当月月初です。

last_day(curdate() - interval 1 month) + interval 1 day

で取得できます。

curdate()で現在の日付を取得、そのひと月前の月の最終日をlast_day()で取得、プラス1日して当月月初です。

mysql> select last_day(curdate() - interval 1 month) + interval 1 day as beg_of_cur_month;
+------------------+
| beg_of_cur_month |
+------------------+
| 2024-01-01       |
+------------------+
1 row in set (0.00 sec)

curdate()last_day()interval+/-を使っていろんな日が取れます。

翌月月初はこれです。

last_day(curdate()) + interval 1 day

現在の日付の月の最終日にプラス1日です。

mysql> select last_day(curdate()) + interval 1 day as beg_of_next_month;
+-------------------+
| beg_of_next_month |
+-------------------+
| 2024-02-01        |
+-------------------+
1 row in set (0.00 sec)

前月月初はこれです。

last_day(curdate() - interval 2 month) + interval 1 day

2ヶ月前の月の最終日の次の日ですね。

mysql> select last_day(curdate() - interval 2 month) + interval 1 day as beg_of_prev_month;
+-------------------+
| beg_of_prev_month |
+-------------------+
| 2023-12-01        |
+-------------------+
1 row in set (0.00 sec)

last_day()を使ってきているので明らからですが月末日です。
それぞれ当月末、翌月末、全月末です。

last_day(curdate())
last_day(curdate() + interval 1 month)
last_day(curdate() - interval 1 month)

実行してみました

mysql> select last_day(curdate()) as end_of_cur_month,
    -> last_day(curdate() + interval 1 month) as end_of_next_month,
    -> last_day(curdate() - interval 1 month) as end_of_prev_month;
+------------------+-------------------+-------------------+
| end_of_cur_month | end_of_next_month | end_of_prev_month |
+------------------+-------------------+-------------------+
| 2024-01-31       | 2024-02-29        | 2023-12-31        |
+------------------+-------------------+-------------------+
1 row in set (0.00 sec)

以前も同じようにしましたが、Timestampカラムcreatedを持つテーブルaccess_logsに前月に記録されたレコード数をとるselectはこうなります。

select count(*) from access_logs
where created >= last_day(curdate() - interval 2 month) + interval 1 day
and created < last_day(curdate() - interval 1 month) + interval 1 day;

RDSによって少しずつ違いますが、同じことをする方法は何かしらありますね。
それぞれ勉強していきたいと思います。

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

それではまた!