Doctrine2 выбирает диапазон дней рождения

#mysql #sql

#mysql #sql

Вопрос:

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

В принципе, я хочу выбрать дату только по месяцам и дням, в диапазоне от 5 дней.

Схема базы данных:

 CREATE TABLE IF NOT EXISTS `tbl_office_employee` (
  `id` int(11) NOT NULL auto_increment,
  `firstname` varchar(256) collate utf8_unicode_ci default NULL,
  `surname` varchar(256) collate utf8_unicode_ci default NULL,
  `birthdate` date NOT NULL,
  `telephone` varchar(256) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`)
)
  

Кто-нибудь знает один запрос для выполнения этого?

Ответ №1:

Вы хотите что-то подобное в MySQL (отредактированный — ДЕЙСТВИТЕЛЬНО РАБОЧИЙ ПРИМЕР):

 SELECT *
FROM `tbl_office_employee` e 
WHERE FLOOR(
        (
            UNIX_TIMESTAMP(
                CONCAT(
                    YEAR(CURDATE())   (DATE_FORMAT(e.birthdate, '%m-%d') < DATE_FORMAT(CURDATE(), '%m-%d')),
                    DATE_FORMAT(e.birthdate, '-%m-%d'))) 
            - UNIX_TIMESTAMP(CURDATE()))
        / 86400) < 5
  

SQL-запрос, написанный ниже, не выбирает день рождения, который в следующем году (т. Е. 1-5 января, когда 31 декабря), поэтому используйте приведенный выше…

ВЫБЕРИТЕ * ИЗ tbl_office_employee e, ГДЕ UNIX_TIMESTAMP(DATE_FORMAT(e.дата рождения, ОБЪЕДИНЕНИЕ(ГОД(CURDATE()), ‘-%m-%d’))) Между UNIX_TIMESTAMP(CURDATE()) И UNIX_TIMESTAMP(DATE_ADD(CURDATE(), ИНТЕРВАЛ 5 ДНЕЙ))

Мне пришлось использовать UNIX_TIMESTAMP из-за смены дня, т. е. с 31 мая по 5 июня (5 не больше 31) и изменить год в e.birthdate .


Это можно сделать в DQL (Doctrine 1):

 Doctrine_Query::create()
    ->select('e.firtsname')
    ->from('tbl_office_employee e')
    ->where('e.date BETWEEN ? AND ?', array($today_date, $date_plus_5_days))
    ->getSqlQuery();
  

который должен выводить в основном то же самое.

Я не думаю, что DATE_ADD это доступно в DQL «из коробки», но в документах DATE_ADD функции для MySQL, в которой есть пример.

Комментарии:

1. При этом выбираются только записи этого года. Мне нужен результат за все годы. Вопрос касается дней рождения. Кстати, спасибо за пример Doctrine, но я использую Doctrine 2.

2. Отредактированный ответ, поэтому он не проверяет год (конечно, дни рождения каждый год ;)).

3. Проверьте мой ответ еще раз — я протестировал его, и оказалось, что он не работает, если день рождения в следующем году (т. е. 1-5 января, когда сейчас 31 декабря).

Ответ №2:

 SELECT * FROM member WHERE DATE_FORMAT(birthdate, '%m%d') between DATE_FORMAT(NOW(), '%m%d') and date_format(adddate(now(), interval 4 day),'%m%d');
  

или

 SELECT * FROM member WHERE DATE_FORMAT(`birthdate`, '%m%d') >= DATE_FORMAT(NOW(), '%m%d') AND DATE_FORMAT(`birthdate`, '%m%d') <= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 4 DAY), '%m%d') ORDER BY DATE_FORMAT(`birthdate`, '%m%d') ASC;
  

или

 SELECT   * FROM member WHERE   (1 =   (FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL   4 DAY),birthdate) / 365.25)) -(FLOOR(DATEDIFF(DATE(NOW()),birthdate)   / 365.25))) ORDER BY MONTH(birthdate),DAY(birthdate)
  

Все запросы протестированы.

Ответ №3:

Хм… Я не тестировал это, но могу попробовать…

 SELECT *, 
CURRENT_DATE()   INTERVAL 5 DAY AS coming_date,
CURRENT_DATE() AS today_date
FROM tbl_office_employee
WHERE birthdate <= coming_date AND birthdate >= today_date
  

Комментарии:

1. При этом не учитывается, что я не хочу указывать год в выборке. Поскольку я хочу выбрать дни рождения, это должно быть независимо от года.