@Talany
Пытаюсь освоить web ;)

Mysql как выбрать ближайший день рождения?

Доброго времени суток!
Знатоки подскажите пожалуйста как из таблицы к примеру users с полем birth, выбрать ближайшее день рождение?
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
abyrvalg
@abyrvalg
Вроде бы всё учтено:
select t2.birthday,
      date_add(
          date_add(
              makedate(b_year, 1),
              interval month(t2.birthday) - 1 month
            ),
          interval
            if(month(t2.birthday) = 2 and day(t2.birthday) = 29 and b_year % 4 <> 0,
               28,
              day(t2.birthday)
            )
            - 1 day
      ) nearest_birthday
from (
      select t.birthday,
             year(@now) +
             if(100 * month(t.birthday) + day(t.birthday) < 100 * month(@now) + day(@now),
               1,
               0
             ) b_year
      from t,
           (select @now := '2012-12-14') vars   -- <<== CURRENT DATE
    ) t2
having timestampdiff(day, @now, nearest_birthday) <= 85 -- <<== WINDOW
order by nearest_birthday
;


Проверялось на вот этих данных:

drop table if exists t;
create table t (
  birthday date not null
);

insert into t(birthday) values('1980-01-01');
insert into t(birthday) values('1980-01-15');
insert into t(birthday) values('1981-02-01');
insert into t(birthday) values('1981-02-15');
insert into t(birthday) values('2000-02-28');
insert into t(birthday) values('2000-02-29');
insert into t(birthday) values('1982-03-01');
insert into t(birthday) values('1982-03-15');
insert into t(birthday) values('1983-04-01');
insert into t(birthday) values('1983-04-15');
insert into t(birthday) values('1983-05-01');
insert into t(birthday) values('1983-05-15');
insert into t(birthday) values('1983-06-01');
insert into t(birthday) values('1983-06-15');
insert into t(birthday) values('1983-07-01');
insert into t(birthday) values('1983-07-15');
insert into t(birthday) values('1983-08-01');
insert into t(birthday) values('1983-08-15');
insert into t(birthday) values('1983-09-01');
insert into t(birthday) values('1983-09-15');
insert into t(birthday) values('1983-10-01');
insert into t(birthday) values('1983-10-15');
insert into t(birthday) values('1983-11-01');
insert into t(birthday) values('1983-11-15');
insert into t(birthday) values('1983-12-01');
insert into t(birthday) values('1983-12-15');
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
NeiroNx
@NeiroNx
Программист
Нужно сформировать новую дату - дату дня рождения в этом году(для этого поменять год), а потом вывести одну(или несколько) у которых до дня рождения 0 дней(используя функцию разницы дат).
SELECT * FROM `users`
WHERE  TIMESTAMPDIFF(DAY, DATE_ADD(`birth`,INTERVAL (YEAR(CURDATE())-YEAR(`birth`)) YEAR), CURDATE()) = 0
Ответ написан
Stalker_RED
@Stalker_RED
Предположим, что нужно 10 ближайших дней рождения
(select id, dayofyear(bithday) day from mytable
having day > dayofyear(now()) -- дни после сегодняшнего
order by day limit 10)

UNION ALL

(select id, dayofyear(bithday) day from mytable
having day > 0 -- дни с начала года, на случай, если до конца года не набралось нужное количество
order by day limit 10)

limit 10
Ответ написан
@alexfix
Получаем д, м, год следующего др.
select DAY(dateBirth), MONTH(dateBirth), 
IF(((MONTH(dateBirth)<MONTH(NOW())) or ((MONTH(dateBirth)=MONTH(NOW()) and ( DAY(dateBirth)<DAY(NOW()))) ))  
, YEAR(NOW())+1, YEAR(NOW()))
from table

с 29 февраля косяк конечно получается :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы