Нахождение даты за месяц вперед в тот же день

0

В MySQL я могу сделать что-то вроде:

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

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

2010-08-02

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

  • 0
    Надеюсь, вы это видите. У моей первой попытки был недостаток :)
  • 0
    ... Как и мой второй: D
Теги:
date

2 ответа

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 недели все равно в тот же месяц, добавьте еще одну неделю.

ОБНОВЛЕНИЕ: Умм, я не думал об этом очень хорошо - он работает для первого Х в месяц, но обязательно для 2-го, 3-го... (т.е. 3-й Х в месяц может вернуть 2-й 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, сегодня я сосать, мне следовало бы подумать, прежде чем опубликовать... Неделя обычно определяется как Mon-Sun или Sun-Mon, а не как от начала месяца до 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
    Ааа, верно. Я полностью упустил это из виду. Я ценю продолжение. Спасибо!
  • 0
    Да, нет проблем. Я очень надеюсь, что не будет 4-го: D
Показать ещё 1 комментарий
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню