У меня есть база данных с датами рождения и именами пользователей. Я хочу выбрать всех пользователей, у которых был день рождения/имена с 7 дней до 7 дней в будущем, этот выбор работает, но я не знаю, как решить проблему с пользователями, у которых есть день рождения/имена 31.12. например. PHP вернет «ПОЛЬЗОВАТЕЛЬ имел день рождения за 3 дня до этого», этот выбор работает хорошо всего за 7 дней до конца года и 7 дней после нового года. Большое вам спасибо за помощь.MySQL за 7 дней до события и через 7 дней после события
SELECT `name`, `surname`, `gender`, ('birthday') AS event,
DATEDIFF(NOW(), DATE(REPLACE(`birthday`, YEAR(`birthday`), YEAR(NOW())))) AS diff
FROM `users`
WHERE DATEDIFF(NOW(), DATE(REPLACE(`birthday`, YEAR(`birthday`), YEAR(NOW()))))
BETWEEN -7 AND 7
UNION
SELECT `name`, `surname`, `gender`, ('namesday') AS event,
DATEDIFF(NOW(), DATE(REPLACE(`namesday`, YEAR(`namesday`), YEAR(NOW())))) AS diff
FROM `users`
WHERE DATEDIFF(NOW(), DATE(REPLACE(`namesday`, YEAR(`namesday`), YEAR(NOW()))))
BETWEEN -7 AND 7
Существует 'DAYOFYEAR'. Но как вы собираетесь справляться с високосными годами (люди, имеющие день рождения 29 февраля, теперь 29 февраля?)? Все это нужно уточнить и выполнить тщательно, я видел, что веб-сайты были отключены из-за таких ошибок, последний раз в этом году ... 29 февраля ;-) – krlmlr
Я думаю, что DATEDIFF (X, Y) работает как TO_DAYS (X) -TO_DAYS (Y), поэтому существует 29.2. включая –
Да. Но, опять-таки, любой код для обработки этого, вероятно, должен рассмотреть четыре (!) Случая: {день рождения (не) 29 февраля} x {'NOW()' is not not Feb 29th}. Кроме того, вычисление отличается в зависимости от того, является ли текущий год високосным годом или нет. Трудно получить это прямо в элегантной манере. – krlmlr