Это стало немного сложнее, но здесь идет:
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));
Упование вы видите это. Моя первая попытка имела недостаток :) – Amadan
... Как и мой второй: D – Amadan