При попытке получить список, у которого есть свои b'days, предстоящие в течение определенного периода времени, мы можем выполнить пару вопросов.
Когда есть високосный год, существует вероятность того, что у вас не получается обработать случай високосных годов. Следующая проблема может быть как сегодня: 2016-12-30
, и вам нужно b'days в течение следующих 7 дней. Таким образом, конец периода в году 2017
. Некоторое условие терпит неудачу в этом случае. Это очень важные тестовые примеры.
Большинство исправленных в этой теме используют DAYOFYEAR()
, который терпит неудачу, когда вы находитесь в високосный год.
например.
DAYOFYEAR('2016-03-01 00:00:00')
является 61
.
DAYOFYEAR('2015-03-01 00:00:00')
является 60
простейшим и наиболее легко понять способ заключается в следующем.
- Рассчитать следующий предстоящий b'day для пользователя.
- Затем проверьте, пришел ли день в нашем ассортименте.
Это работает на високосные годы, а также диапазон дат в течение двух лет.
SELECT *
FROM `PERSONS`
WHERE
/*
Here we calculate the next coming b'day for user
and check if it is between our span
*/
CONCAT(IF(
CONCAT(YEAR(CURDATE()), substring(`BIRTHDAY`, 5, length(`BIRTHDAY`))) < CURDATE(),
YEAR(CURDATE()) + 1, /* Adds an year if already past */
YEAR(CURDATE()) /* Use this year if it is upcoming */
), substring(`BIRTHDAY`, 5, length(`BIRTHDAY`)))
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL @tot DAY)
PS: Также это лучшее решение, если вы хотите заказать их на основе b'days. Вам просто нужно добавить это как поле.
Первый запрос будет возвращать только новорожденные, то второй будет возвращать только людям, родившимся в будущем .... –
@GoatCO дух! глядя на вопрос и запрос OP, я просто предположил, что день рождения в текущем году хранится в таблице. Во всяком случае, обновленный ответ. Надеюсь, что это сработает. – Lobo
Справа у меня другая проблема, которую я не понимал. День рождения хранится как varchar, например '04/16/1993 ', каким-либо образом работать с этим? – Danny