Mega Code Archive

 
Categories / MySQL / Date Time
 

Calculate the last day of the month for the previous, current, and following months relative to a given date

n would be -1, 0, and 1 mysql> mysql> CREATE TABLE date_val     -> (     ->  d       DATE     -> ); Query OK, 0 rows affected (0.01 sec) mysql> mysql> INSERT INTO date_val (d) VALUES('1864-02-28'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO date_val (d) VALUES('1900-01-15'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO date_val (d) VALUES('1987-03-05'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO date_val (d) VALUES('1999-12-31'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO date_val (d) VALUES('2000-06-04'); Query OK, 1 row affected (0.00 sec) mysql> mysql> mysql> SELECT d,     -> DATE_SUB(     -> DATE_ADD(DATE_SUB(d,INTERVAL DAYOFMONTH(d)-1 DAY),INTERVAL 0 MONTH),     -> INTERVAL 1 DAY)     -> AS 'last, prev. month',     -> DATE_SUB(     -> DATE_ADD(DATE_SUB(d,INTERVAL DAYOFMONTH(d)-1 DAY),INTERVAL 1 MONTH),     -> INTERVAL 1 DAY)     -> AS 'last, this month',     -> DATE_SUB(     -> DATE_ADD(DATE_SUB(d,INTERVAL DAYOFMONTH(d)-1 DAY),INTERVAL 2 MONTH),     -> INTERVAL 1 DAY)     -> AS 'last, following month'     -> FROM date_val; +------------+-------------------+------------------+-----------------------+ | d          | last, prev. month | last, this month | last, following month | +------------+-------------------+------------------+-----------------------+ | 1864-02-28 | 1864-01-31        | 1864-02-29       | 1864-03-31            | | 1900-01-15 | 1899-12-31        | 1900-01-31       | 1900-02-28            | | 1987-03-05 | 1987-02-28        | 1987-03-31       | 1987-04-30            | | 1999-12-31 | 1999-11-30        | 1999-12-31       | 2000-01-31            | | 2000-06-04 | 2000-05-31        | 2000-06-30       | 2000-07-31            | +------------+-------------------+------------------+-----------------------+ 5 rows in set (0.00 sec) mysql> mysql> drop table date_val; Query OK, 0 rows affected (0.00 sec)