2017-02-23 52 views
3

У меня есть таблица с днями рождения в них, отформатированная в ГГГГ-ММ-ДД. Моя цель - вернуть результаты, если день рождения будет в течение следующих 7 дней.Выберите следующие 7 дней, используя только день и месяц

Мне нужен он, чтобы использовать только месяц и день, потому что, если он читает год, день рождения в 1993 году никогда не будет в течение следующих 7 дней. Также необходимо учитывать месячные изменения.

Например, если его 28 февраля и день рождения в таблице 1 марта, это будет в течение 7 дней, но не в течение того же месяца.

SELECT * FROM user WHERE DATE_FORMAT(birthday, '%m-%d') >= DATE_FORMAT(NOW() - INTERVAL 7 DAY, '%m-%d') 

Здесь я нахожусь, на данный момент, но я знаю, что я в милях отсюда.

+0

Почему бы не использовать date_add, а затем использовать между ними, чтобы получить ваши значения? 'SELECT * FROM Таблица WHERE date BETWEEN date1 и date2'? – Takarii

ответ

1

Вам необходимо отформатировать обе даты в предложении WHERE.

SELECT * 
FROM user 
WHERE DATE_FORMAT(birthday, '%m-%d') BETWEEN DATE_FORMAT(NOW(), '%m-%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 7 DAY), '%m-%d') 
+0

Блестяще благодарю вас! Будет ли это работать в течение месяца? –

+1

вы сравниваете строки, это будет работать в течение месяца, но не в конце года (например, если теперь возвращается 27 декабря) –

0

получить в текущем году с начала года (CURDATE(), сделайте дату бий конкатенации с месяц и день приходить со дня рождения и удалить 7 дней, проверьте CURDATE находится в диапазоне:

select * 
from user 
where 
Curdate() between date_sub(CONCAT(YEAR(CURDATE()),'-', date_format(birthday, '%m-%d')), interval 7 day) 
and CONCAT(YEAR(CURDATE()),'-', date_format(birthday, '%m-%d')) ; 
0

Тейк летнюю часть с сегодняшней даты и объединить ее с месячной и дневной частью значения столбца dob. И отбросить эту строку до даты. Затем используйте это в качестве подзапроса и проверьте, не отличается ли новая разница в столбце дня от 0 до 7.

Вопрос

SELECT t.* -- select except the `new_col` 
FROM (SELECT *, 
      CAST((Concat(YEAR(NOW()), '-', DATE_FORMAT(dob, '%m-%d'))) AS DATE 
     ) AS 
       `new_col` 
    FROM `user`)t 
WHERE DATEDIFF(t.`new_col`, NOW()) BETWEEN 0 AND 7;