开发者

Adding months to a date with keeping the last day of given month

Suppose that I have a date "Jan 31 2011" and I want to add a month to this date.

New date is is okay "Feb 28 2011", when I want to add a month again it gives me "March 28 2011", but I need it to be "March 31 2011".

Oracle has a built-in function for that as Tony Andrews replied to this question,

Add date without exceeding a month

But how to implement this function in PHP? (also MySQL solution is welcome)

edit #1

@zerkms, this is the nearest answer thanks for your help. Here is the second deal

I changed your solution a little bit to solve my real-life problem

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))

Your helpful solution gives me "2011-03-28" but I want to "2011-03-30". Any ideas?

edit #2

Here is the solution with @zerkms' help. Thank you!

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)))

edit #3 Here is the exact solution. After dealing with some strange behaviours this is the exact solution

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)),'-',开发者_StackOverflow中文版DAY(@BEGINNING_DATE)) + INTERVAL 0 MONTH)


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

This query takes into account if it is the end of the month or not.


MySql has a LAST_DAY function which returns the last day of any given month.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜