В MySQL я могу сделать что-то вроде:
SELECT DATE_ADD ('2010-07-02', INTERVAL 1 MONTH)
И это возвращает:
2010-08-02
Это здорово... теперь есть функция MySQL, которую я могу использовать, чтобы узнать, какая дата будет за месяц до этого в тот же день. Например, 7/2/2010 приходится на первую пятницу июля 2010 года. Есть ли простой способ найти, что первая пятница августа 2010 года с выражением SQL?
Это немного усложнилось, но здесь идет:
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));
Это делает трюк?
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
)