Выбор именинников.

zag

Guest
Выбор именинников.

Довольно банальная задачка стала мне поперек горла, нужно выбрать из базы данных всех у кого днюха в ближайшую и прошедшую неделю. Вроде бы все просто, но столько наворотов появляется в первую и последние недели года..

Может кто делал что то подобное или у кого есть скриптик, подкинте.
 

Trojan

Guest
Формат даты входящей Y-m-d переменная $date
PHP:
date ("Y-m-d", mktime (0, 0, 0, substr($date, 5, 2), substr($date, 8, 2)+ 7, substr($date, 0, 4)));
 

zag

Guest
Trojan, я не понял, зачем мне строчка добавления даты ? Мне нужно сделать выборку из БД..
 

Trojan

Guest
тебе надо сделать выборку между двумя датами, у тебя проблемма с выщитыванием дат эта строка которая правильно плусует и минусует любое количестго дней, месяцев, лет а дальше простая выборка

select поля from таблицы where поле_с_датой between 'дата_от' and 'дата_до'
 

asman

Guest
если под неделями подразумевается ±7 дней от текущей даты, то можно так:
[sql]select * from people_tb where birth_date between date_sub(now(),interval 7 day) and date_add(now(),interval 7 day);[/sql]
 

zag

Guest
asman, это вполне сработало бы, если бы все родились в текущий год.. те. дни рождения то бывают в разные годы, а твоя выборка выбирает только семидневных новорожденных и еще нерожденных :)

[sql]
select nick,user_id, user_age from users where DAYOFYEAR(user_age) BETWEEN DAYOFYEAR(NOW())-7 AND DAYOFYEAR(NOW())+7
[/sql]

Но и это не совсем верно получается, есть два исключения - когда NOW() - последние или первые 7 дней года.
 

chira

Новичок
еще вариант для типа данных DATETIME
[SQL]
SELECT * FROM `d`
WHERE CONCAT( YEAR( NOW( ) ) , '-', DATE_FORMAT( user_age , '%m-%d %T' ) )
BETWEEN DATE_SUB( NOW( ) , INTERVAL 7 DAY )
AND DATE_ADD( NOW( ) , INTERVAL 7 DAY )
[/SQL]
 

zip2003

Guest
А как сделать если нужно выводить за неделю в так допустим
через 7 дней у такого-то день рождение
через 2 дня у такого-то день рождение
завтра у такого-то день рождение
если хрониться дата в базе таким макаром: 1982-09-25
???
 

Avenus

Under Glory Yield
Мучаюсь над тем же, только нужно отсортировать выборку по ближайшим датам рождения.
Т.е. если сегодня 06.12, то должен получить:
0312
2012
0802
1505
...
Как, не могу понять?
Поле birthday - формат DATE
PHP:
select *,DATE_FORMAT(birthday,"%d%m") as bd order by bd
Получу:
0802
1505
0312
2012

Понимаю, что нужно каким-то образом сравнить birthday с текущим число-месяц.
Может быть, так: если больше, то прибавлять к ней год (12 месяцев).

Получится, если сегодня 0612:
0802+0012=0814
1505+0012=1517
0312
2012

И отсортируется:
0312
2012
0814
1517

Подскажите, пожалуйста, верная мысль или бред?
Если нормальное решение, то как его языком mysql написать :)

-~{}~ 06.12.09 01:22:

Пока решил задачу так:
PHP:
IF(
 DATE_FORMAT(birthday,"%m%d")<DATE_FORMAT(CURDATE(),"%m%d"),
 DATE_FORMAT(birthday,"%m%d")+1200,
 DATE_FORMAT(birthday,"%m%d")
) as s
...
ORDER BY s
 

baev

‹°°¬•
Команда форума
Avenus, Вы же видите, что в этой теме за шесть с лишним лет так и не появилось нового ответа.

Почему Вы думаете, что ответ сейчас появится?
 

Farsh

~ on ~ high ~ wave ~
zip2003
Может я туплю, но помоему это очень легко решается:
1) в базе дни рождения храним также ( или только, или конвертируем на лету ) в timestamp
2) в php узнаем временные промежутки предыдущей и следующей недели
3) тупо выбираем людей с этими промежутками

А как сделать если нужно выводить за неделю в так допустим
через 7 дней у такого-то день рождение
через 2 дня у такого-то день рождение
(time_of_birth - time()) / (60 * 60 * 24) = кол-во дней

p.s.

ой плять, на дату не посмотрел )))))))))))))))

-~{}~ 06.12.09 02:22:

Avenus
а Вам тогда еще получить положительную разницу в секундах и отсортировать )
 

Adelf

Administrator
Команда форума
тебе нужно тупо взять разницу между текущей и ДР, отсортировать по ней, но сделать так, чтобы положительные шли раньше отрицательных.
Вторым в ORDER BY должна быть разница. А первым признак отрицательности. Нужные функции сам ищи.
 

Alexandre

PHPПенсионер
сделайте доп поле day - номер дня от начала года и выводите на здоровье своих именинников как предлагали выше:

BETWEEN day_begin AND day_end
константы day_begin и day_end лучше высчитать до составления запроса.
 

brook

Новичок
у меня получилось както так

Код:
select ...  IF(dayofyear(birthday) - dayofyear(curdate()) < 0, 366 + dayofyear(birthday) - dayofyear(curdate()), dayofyear(birthday) - dayofyear(curdate())) as days_remaining
from ....
order by days_remaining
это вывод ближайших деньрожденьистов
 

Beavis

Banned
Автор оригинала: Alexandre
сделайте доп поле day - номер дня от начала года и выводите на здоровье своих именинников как предлагали выше:

BETWEEN day_begin AND day_end
константы day_begin и day_end лучше высчитать до составления запроса.
в году количество дней бывает разное
 

Beavis

Banned
Alexandre
да мне ничего не мешает, только мне это не нужно)
просто номер дня от начала года может быть разный для одной и той же даты, так что получится ещё дополнительная логика, которая не делает твой вариант удобнее тех что приведены выше
 
Сверху