2011-01-09 3 views
1

Предположим, что у меня есть дата «31 2011 Jan», и я хочу, чтобы добавить месяц к этой дате.Добавление месяцев до даты с сохранением последнего дня данного месяца

Новая дата в порядке «28 февраля 2011», когда я хочу, чтобы добавить месяц снова это дает мне «28 марта 2011», но мне нужно, чтобы это было «31 марта 2011».

Oracle имеет встроенную функцию, которая, как Тони Эндрюс ответил на этот вопрос,
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

В mysql вы можете сделать это 'DATE_ADD ('2006-05-00', INTERVAL 1 MONTH)', чтобы добавить месяц к указанной дате – cristian

+0

Ну, '27 фев 2011 + месяц == 27 марта 2011'. '28 фев 2011 + месяц == 31 марта 2011'. Разве это не странно? Какую задачу вы пытаетесь решить таким образом? – zerkms

+0

, если вы хотите, чтобы последний день следующего месяца смотрите на http://stackoverflow.com/questions/3009896/get-the-first-and-last-date-of-next-month-in-mysql –

ответ

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

MySql имеет LAST_DAY функцию, которая возвращает последний день любого месяца.

Смежные вопросы