假设我的日期“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)
答案 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函数,它返回任何给定月份的最后一天。