将日期添加到保留给定月份的最后一天的日期

时间:2011-01-09 09:31:02

标签: php mysql datetime date

假设我的日期“2011年1月31日”,我想在此日期添加

新日期是好的“2011年2月28日”,当我想再添加一个月时它会给我“2011年3月28日”,但我需要它“2011年3月31日”

Oracle有一个内置功能,因为Tony Andrews回答了这个问题,
Add date without exceeding a month

但是如何在PHP中实现这个功能呢? (也欢迎MySQL解决方案)

编辑#1
@zerkms,这是最近的答案感谢您的帮助。这是第二笔交易

我改变了你的解决方案以解决我的现实问题

SET @BEGINNING_DATE := '2011-01-30'; /* first date for payment */  
SET @NEXT_END_DATE := '2011-02-28'; /* next date for payment (second payment deadline) */

/* now I want to find third payment deadline */

SELECT IF(@BEGINNING_DATE = LAST_DAY(@BEGINNING_DATE), LAST_DAY(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)), DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH))

你有用的解决方案给了我“2011-03-28”,但我想要“2011-03-30”。 有什么想法吗?

编辑#2
这是@zerkms帮助的解决方案。谢谢!

SET @BEGINNING_DATE := '2011-02-28'; /* first date for payment */
SET @NEXT_END_DATE := '2011-05-31'; /* next date for payment (second payment deadline */

SELECT IF(@BEGINNING_DATE = LAST_DAY(@BEGINNING_DATE), LAST_DAY(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)), CONCAT(YEAR(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)),'-',LPAD(MONTH(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)),2,'0'),'-',DAY(@BEGINNING_DATE)))

编辑#3 这是确切的解决方案。在处理了一些奇怪的行为之后,这就是确切的解决方案

SET @@session.sql_mode = 'ALLOW_INVALID_DATES';
SET @BEGINNING_DATE := '2011-01-29'; /* first date for payment */  
SET @NEXT_END_DATE := '2011-02-28'; /* next date for payment (second payment deadline) */

SELECT IF(@BEGINNING_DATE = LAST_DAY(@BEGINNING_DATE), LAST_DAY(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)), CONCAT(YEAR(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)),'-',MONTH(DATE_ADD(@NEXT_END_DATE, INTERVAL 1 MONTH)),'-',DAY(@BEGINNING_DATE)) + INTERVAL 0 MONTH)

2 个答案:

答案 0 :(得分:3)

SET @DT := '2011-02-28';

SELECT IF(@DT = LAST_DAY(@DT), LAST_DAY(DATE_ADD(@DT, INTERVAL 1 MONTH)), DATE_ADD(@DT, INTERVAL 1 MONTH));

// returns 2011-03-31

此查询会考虑是否是月末。

答案 1 :(得分:1)

MySql有一个LAST_DAY函数,它返回任何给定月份的最后一天。