MySQL 欄位 日期欄位延展到 N 個月底

需求 將 DB 的一個欄位的時間全部延展到 N 個月的月底

SQL

1
2
DATE_ADD(datetime, INTERVAL expr unit)
DATE_SUB(datetime, INTERVAL expr unit)

unit 參數可使用的值

比較常用的 其他就自己去看文件吧

  • YEAR
  • MONTH
  • WEEK
  • DAY
  • HOUR
  • MINUTE
  • SECOND

範例

1
UPDATE `Table` SET column = DATE_ADD(column, INTERVAL 1 MONTH)

也可以使用 負數來達到跟DATE_SUB一樣的效果

1
UPDATE `table` SET column = DATE_ADD(column, INTERVAL -1 MONTH)

遇到問題

問題 1

當欄位的值為小月/2月只有28,29天時,加上一個月會造成只加 month,day 並不會為最後一日

2021-11-30 => 2021-12-30 的情況

SQL

1
LAST_DAY(date)

合併後為

1
UPDATE `table` SET Column = LAST_DAY(DATE_ADD(column, INTERVAL 1 MONTH))

問題 2

原先的數值為 2021-11-30 23:59:59 但 變成 2021-12-31 00:00:00

合併後為

1
UPDATE `table` SET column = LAST_DAY(DATE_ADD(column, INTERVAL 1 MONTH)) + INTERVAL 1 DAY - INTERVAL 1 SECOND

參考網站:
https://www.w3school.com.cn/sql/func_date_add.asp
https://www.w3schools.com/sql/func_mysql_last_day.asp
https://stackoverflow.com/questions/11617120/get-last-second-of-a-date-in-mysql

如果這一篇文章有幫助到你的話,
請您幫忙點選廣告,都是以不擾人與不強迫的方式呈現