Код (Text): echo strftime('%c',strtotime('14 december 1901')); возвращает: Код (Text): 14.12.1901 0:00:00 что я делаю не так? отрицательные метки времени определённо работают на winXP sp2, впрочем, это не шибко актуально...
зато каждый день перелопачиваешь всю базу. зачем? а если нужно вывести счётчик: "до вашего дня рождения осталось ** дней, ** часов, ** минут и ** секунд"? будешь каждую секунду перелапачивать всю базу? ага, твои вычисления сильно грузят сервак. Код (Text): select * from users where nextbirthday between $now and $nowplus30day Код (Text): date('Y')-date('Y',$birthday);
dark-demon Но что бы выбрать этих пользователей, в базе должно быть записано сколько дней у человека до дня рождения Между прочим Код (Text): SELECT * FROM users WHERE prf_days_left <= 30; Он тупо быстрее отработает чем с BETWEEN
Psih, экономия на спичках. и коли уж упрощать, то по максимуму: Код (Text): SELECT * FROM users WHERE birthday_in_next_30_day = 1;
А вот это большая глупость, потому что ты не можешь сказать точно сколько дней осталось до дня рождения! Может завтра, а может через неделю. А может сегодня
нет не большая он просто пошел по твоему пути ты ведь свою процедуру запускаешь раз в сутки кто мешает dark-demon-у так же записывать количество дней до ДР?
в постановке задачи этого небыло плох не запуск раз в сутки (его по любому делать), а то, что ты раз в сутки меняешь данные из каждой записи, без особой на то необходимости.
Дык, а ведь так и надо делать, потому что раз в сутки инфа для каждой записи меняеться. Именно раз в сутки, а не каждый запрос!
Это очень полезно делать например по какой-нибудь базе жителей Москвы. Может стоить подходить к вопросу с точки зрения баланса между значимостью инфы и частотой её востребованности? Нах вообще ежесуточно грузить большую базу и получать пинки от хостера только для того чтобы знать сколько дней осталось до дня рождения какого-то чела?
Ну не вы же строите сайт, вам не вдомёк зачем это надо Я постанул кусок кода, довольно полезный. Вам не надо, а кому-то может понадобиться.
На самом деле все решается одним SQL запросом, естественно в разных БД он будет выглядеть по разному, вот пример для MSSQL, может и коряво, но работает: [sql]SELECT CASE isdate(convert(char(2),a.date1, 1) + '-' + convert(char(2),a.date1, 3) + '-' + str(YEAR(getdate()))) When 1 then DATEDIFF(day, convert(datetime, str(YEAR(getdate()))+ convert(char(2),a.date1, 1)+ convert(char(2),a.date1, 3), 8),getdate()) Else DATEDIFF(day, convert(datetime, str(YEAR(getdate()))+ convert(char(2),a.date1, 1)+ convert(char(2),a.date1-1, 3), 8)+1,getdate()) End FROM proba_date a [/sql] В таблице proba_date, поле date1 - день рождения человека, соответственно запрос возвращает количество дней прошедших со дня рождения - это будут положительные числа и соответственно сколько осталось до дня рождения - это будут отрицательные числа, 0 означает что день рождения сегодня.