MySQL で月初と月末の日付を取得する方法
MySQL
Published: 2018-11-18

目的

MySQL からデータを月次で抽出する必要がありました。

ある日にちから、月初と月末を取得する方法を調べました。

方法

SET @TARGET_DATE='2018/11/18';

-- @TARGET_DATE 月の月初
SELECT DATE_FORMAT(@TARGET_DATE, '%Y-%m-01');

-- @TARGET_DATE 月の月末
SELECT LAST_DAY(@TARGET_DATE);

出力結果

mysql> SET @TARGET_DATE='2018/11/18';
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> -- @TARGET_DATE 月の月初
mysql> SELECT DATE_FORMAT(@TARGET_DATE, '%Y-%m-01');
+---------------------------------------+
| DATE_FORMAT(@TARGET_DATE, '%Y-%m-01') |
+---------------------------------------+
| 2018-11-01                            |
+---------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- @TARGET_DATE 月の月末
mysql> SELECT LAST_DAY(@TARGET_DATE);
+------------------------+
| LAST_DAY(@TARGET_DATE) |
+------------------------+
| 2018-11-30             |
+------------------------+
1 row in set (0.00 sec)

また、1ヶ月後、2ヶ月後を計算するときは、

SET @TARGET_DATE='2018/11/18';

SELECT DATE_FORMAT(ADDDATE(@TARGET_DATE, INTERVAL 1 MONTH), '%Y-%m-01');

出力結果

mysql> SELECT DATE_FORMAT(ADDDATE(@TARGET_DATE, INTERVAL 1 MONTH), '%Y-%m-01')
    -> ;
+------------------------------------------------------------------+
| DATE_FORMAT(ADDDATE(@TARGET_DATE, INTERVAL 1 MONTH), '%Y-%m-01') |
+------------------------------------------------------------------+
| 2018-12-01                                                       |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

参考