Doctrine2 выберите диапазон дня рождения - PullRequest
6 голосов
/ 31 мая 2011

Я хочу выбрать всех сотрудников, у которых есть день рождения в ближайшие 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`)
)

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

Ответы [ 3 ]

4 голосов
/ 31 мая 2011

Вы хотите что-то подобное в 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 декабря), поэтому используйте один выше ...

Мне пришлось использовать 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 "из коробки", но в есть глава под названием Пользовательские функции DQL в документах, в которой есть пример реализации DATE_ADD функция для MySQL .

1 голос
/ 27 апреля 2012
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)

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

0 голосов
/ 31 мая 2011

Хм ... Я не проверял, но могу попробовать ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...