2010-07-07 4 views
0

В MySQL, я могу сделать что-то вроде:найти дату за один месяц в тот же день

ВЫБОР DATE_ADD ('2010-07-02', ИНТЕРВАЛ 1 МЕСЯЦ)

И это возвращает:

2010-08-02

это здорово ... теперь есть M ySQL, которую я могу использовать, чтобы узнать, какая дата будет за один месяц вперед в тот же день. Например, 7/2/2010 приходится на первую пятницу июля 2010 года. Есть ли простой способ найти, что первая пятница августа 2010 года с SQL-заявлением?

+0

Упование вы видите это. Моя первая попытка имела недостаток :) – Amadan

+0

... Как и мой второй: D – Amadan

ответ

1

Это стало немного сложнее, но здесь идет:

SELECT IF(MONTH(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) = MONTH('2010-07-02'), 
    DATE_ADD('2010-07-02', INTERVAL 35 DAY), 
    DATE_ADD('2010-07-02', INTERVAL 28 DAY)); 

Обоснование: При добавлении 4 недель или 5 недель, вы все еще в тот же день; поскольку все месяцы составляют от 28 до 35 дней, если через 4 недели все равно в том же месяце, добавьте еще одну неделю.

ОБНОВЛЕНИЕ: Умм, я не думал об этом очень хорошо - он работает для первого X в месяц, но обязательно для 2-го, 3-го ... (т. Е. Третий месяц месяца может возвратить второй X в следующем месяце) , Попробуйте # 2:

SELECT IF(
    CEIL(DAY(DATE_ADD('2010-07-02', INTERVAL 35 DAY))/7) = CEIL(DAY('2010-07-02')/7), 
    DATE_ADD('2010-07-02', INTERVAL 35 DAY), 
    DATE_ADD('2010-07-02', INTERVAL 28 DAY)); 

Обоснование: CEIL(DAY(x)/7) это номер недели Икса. Если вы добавили 5 недель, добавьте 4 недели.

ОБНОВЛЕНИЕ 2: LOL, я сосать сегодня, я должен действительно подумать, прежде чем я опубликую ... Неделя обычно определяется как Пн-Вс, или Солнце-Пн, а не от того, что начиналось месяц до 6 дней спустя , Чтобы компенсировать это:

SELECT IF(
    CEIL((DAY(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) - DAYOFWEEK('2010-07-02'))/7) 
    = CEIL((DAY('2010-07-02') - DAYOFWEEK('2010-07-02'))/7), 
    DATE_ADD('2010-07-02', INTERVAL 28 DAY), 
    DATE_ADD('2010-07-02', INTERVAL 35 DAY)); 
+0

Ahh, справа. Я полностью забыл об этом. Я ценю последующие действия. Спасибо! –

+0

Да, без проблем. Я действительно надеюсь, что не будет четвертого: D – Amadan

+0

Обновление 2 тоже не работает. Второй «номер недели» равен нулю (утверждение в CEIL() отрицательное). Пример чего-то неудачного: 2010-07-06 - 2010-08-10. 2010-07-06 лежит в первый вторник месяца. 2010-08-10 находится во второй вторник месяца. –

0

Это делает трюк?


SELECT DATE_ADD(
      DATE_SUB(
       DATE_ADD('2010-07-06', INTERVAL 1 MONTH), 

       INTERVAL DAYOFWEEK(DATE_ADD('2010-07-06', INTERVAL 1 MONTH)) DAY 
      ), 

      INTERVAL DAYOFWEEK('2010-07-06') DAY 
     ) 
+0

Это похоже на работу 1 июня 2010 года, но после добавления кода для добавления 7 дней, если месяц, полученный в тот же месяц, как и в начале месяца, все выглядит лучше. Пока: p –

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