2010-09-23 5 views
1

Я пытался получить предстоящие дни рождения, используя инструкцию mysql и php. Проблема в том, что я видел некоторые решения, но они используют поля даты. К сожалению, моя хранится как временные метки. Приведенный ниже код дает результаты, если дата рождения после 1970 года. Как я могу получить запрос, который даст мне текущий месяц, следующий месяц, месяц после и так далее предстоящих дней рождения? И как я могу заставить его игнорировать год?Получите предстоящие дни рождения Mysql и PHP

$sql_query = " 
     SELECT mem_id, DATE_FORMAT(FROM_UNIXTIME(birthdate),'%d/%m/%Y') 
) 
     FROM profiles 
     WHERE 
      IF (MONTH(NOW()) < 12, 
       MONTH(DATE_FORMAT(FROM_UNIXTIME(birthdate),'%Y%m%d')) = MONTH(NOW()) + 1, 
       MONTH(DATE_FORMAT(FROM_UNIXTIME(birthdate),'%Y%m%d')) = 1) 
     ORDER BY birthdate"; 
+0

Принял свобода сделать это более удобочитаемым. – deceze

+2

Вы имеете в виду, что они хранятся как отметки времени UNIX как целые числа или столбцы типа timestamp? – deceze

+1

Логика даты не имеет для меня смысла - если ТЕПЕРЬ не декабрь, получите дни рождения, которые на месяц раньше текущего месяца. В противном случае получите их на январь. –

ответ

0
$currentMonth = date('n'); // or date('n', strtotime('+1 month')) or whatever 
$query = "SELECT ... WHERE MONTH(FROM_UNIXTIME(`birthday`)) = $currentMonth"; 

Примечание, однако, что UNIX временные метки являются ужасным выбором для хранения рождения:

  • Они не могут хранить даты до 1970 года (если не использовать отрицательные числа, которые не может работать везде) ,
  • Чтобы запросить их в базе данных, вам необходимо преобразовать все записей FROM_UNIXTIME, чтобы сравнить их, что довольно дорого.

Вы должны использовать собственный MySQL DATE columns, чтобы хранить даты, что позволяет хранить гораздо более широкий диапазон дат и намного эффективнее для запросов.

2

Я искал для этого кода, но я не мог найти чистый/простой запрос (который также работает с високосными годами (29 февраля) проблемы)

Так я сделал мой собственному ,

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

SELECT name, date_of_birty FROM users WHERE 
     DATE(CONCAT(YEAR(CURDATE()), RIGHT(date_of_birty, 6))) 
       BETWEEN 
       DATE_SUB(CURDATE(), INTERVAL 1 DAY) 
       AND 
       DATE_ADD(CURDATE(), INTERVAL 5 DAY) 
+2

Что происходит для людей, чей день рождения 1 января? Когда это будет 30 декабря 2012 года, этот запрос будет проверять, будет ли 2012-01-01 в ближайшие 1-5 дней, когда он должен проверять 2013-01-01. Мало того, что они должны иметь день рождения в новый день, никто не был напомнён об этом. – buffcoredave

+1

Помог мне действительно – humphrey

Смежные вопросы