php mysql поиск дня рождения между двумя датами

Мне нужно найти день рождения людей из таблицы .. наступающие в ближайшие 7 дней с сегодняшнего дня. У меня есть запрос .._ 1_tableWHEREdobLIKE BETWEEN %-08-17 AND %-08-24, но он возвращает записи, даты которых не отправлены в базу данных .. я имею в виду, что запись - 0000-00-00. Я сохранил даты рождения в формате дат в таблице. Пожалуйста, помогите мне найти ошибку.


person user1110597    schedule 17.08.2012    source источник
comment
каков тип данных столбца даты в вашей таблице? дата или строка?   -  person Anoop    schedule 17.08.2012
comment
тогда вы можете использовать BETWEEN, чтобы указать две даты   -  person Anoop    schedule 17.08.2012
comment
Много дубликатов по этому типу вопросов. stackoverflow.com/questions/83531/sql-select-upcoming-birthdays (для SS, но тот же принцип)   -  person Kermit    schedule 17.08.2012


Ответы (5)


Поскольку это mysql, я не знаю, DATE_FORMAT () < / strong> может работать над этим. Но попробуйте.

SELECT * FROM users WHERE DATE_FORMAT(dob, '%c-%d') 
BETWEEN DATE_FORMAT('1983-08-17', '%c-%d') 
AND DATE_FORMAT('1983-08-24', '%c-%d') OR (MONTH('1983-08-17') > MONTH('1983-08-24')
AND (MONTH(dob) >= MONTH('1983-08-17') 
OR MONTH(dob) <= MONTH('1983-08-24')))

можно использовать любой год (только для завершения формата даты), поскольку год не имеет значения

ОБНОВЛЕНИЕ 1

Протестировал на SQLFiddle.com

демонстрация SQLFiddle

ОБНОВЛЕНИЕ 2

Прошу прощения за свой первый ответ. Я честно пропустил эту строчку coming in next 7 days from today. И я думаю, что это было причиной того, что Imre L проголосовал против меня. Он прав. Причина, по которой я опубликовал такой ответ, заключалась в том, что я думал, что OP запрашивает промежуточные дни независимо от year. Итак, вот обновление.

SELECT ....
FROM   ....
WHERE  DATE(dob) BETWEEN NOW() AND NOW() + INTERVAL 7 DAY

Надеюсь, теперь все ясно. : D

person John Woo    schedule 17.08.2012
comment
Умный. Это работает примерно на десятую долю секунды лучше, чем моя идея с моим набором данных (просто случайная таблица с множеством записей и дат). Я копаю это. - person MetalFrog; 17.08.2012
comment
что, если текущая дата - 30.08.2012, а +7 - 06.09.2012. А если текущая дата - 30.12.2012? - person Imre L; 17.08.2012
comment
@MetalFrog Протестировал, и он работал Ссылка на демонстрацию SQLFiddle - person John Woo; 17.08.2012
comment
-1, потому что он полностью разбит на 2 случая: 1) когда год меняется в следующие 7 дней 2) когда он будет в октябре в следующие 7 дней (это сравнение строк) - person Imre L; 17.08.2012
comment
Ваш ответ отредактирован, ответ все еще неверен. Потому что ни у кого в базе не может быть дней рождения в будущем =) - person Max; 24.01.2014

это будет правильно обрабатывать случаи, когда между диапазоном дат есть изменение месяца или года:

select *
  from people
 where (DAYOFYEAR(dob)+IF(DAYOFYEAR(CURDATE())>DAYOFYEAR(dob),1000,0)) 
       between DAYOFYEAR(CURDATE()) 
           and (DAYOFYEAR(CURDATE() + INTERVAL 7 DAY)+IF(DAYOFYEAR(CURDATE())>DAYOFYEAR(CURDATE() + INTERVAL 7 DAY),1000,0))
person Imre L    schedule 17.08.2012

Преобразуя дату dob в дату этого года, вы можете избежать проблем, когда период пересекает границу месяца или года. Это выбирает все строки, в которых дата рождения приходится на следующую неделю:

SELECT * FROM users
WHERE concat( year(now()), mid(dob,5,6) ) 
BETWEEN now() AND date_add(now(), interval 7 day)
person POM    schedule 25.07.2014

SELECT
str_to_date(DATE_ADD(dob, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(dob)) YEAR), '%Y-%m-%d') BIRTHDAY,A.*
FROM app_membership A
WHERE str_to_date(DATE_ADD(dob, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(dob)) YEAR), '%Y-%m-%d') 
      BETWEEN str_to_date('15-10-2017','%d-%m-%Y') and str_to_date('10-11-2017','%d-%m-%Y')
ORDER BY BIRTHDAY ASC;

Попробуй это. Работал у меня.

person Manoj Kumar    schedule 20.10.2017

Перечислим людей, родившихся в любом месяце / году в период с 14 декабря по 24 августа. Мы знаем, что это год раньше другого. Мы должны считать с месяцами предыдущего года. Это сложно, потому что у вас могут возникнуть проблемы со сравнением месяца начальной даты с месяцем конечной даты. Однако это можно решить с помощью этого запроса:

SELECT * FROM t_users WHERE (DATE_FORMAT(d_birth, '%m-%d') 
BETWEEN DATE_FORMAT('2017-12-14', '%m-%d') AND 
DATE_FORMAT('2018-08-24', '%m-%d'))

OR(MONTH('2017-12-31') >= MONTH('2018-08-24')
AND (MONTH(d_birth) >= MONTH('2017-12-31') 
OR MONTH(d_birth) <= MONTH('2018-08-24')))
person Matteus Barbosa    schedule 18.01.2018