2011-05-31 79 views
6

我想选择所有在即将到来的5天内生日的员工。生日保存在日期栏中。这感觉就像我必须使用一个之间,但是然后年份范围破坏结果。Doctrine2选择生日范围

基本上我想按月份和日期选择一个日期,范围为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`) 
) 

有谁知道一个查询做到这一点?

回答

4

你想在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查询不选择生日这AR e明年(即上1-5th一月,当它的12月31日),所以使用上面一个...

SELECT * FROM tbl_office_employee e其中UNIX_TIMESTAMP(DATE_FORMAT(e.birthdate,CONCAT( YEAR(CURDATE()), ' - %间%d')))之间的UNIX_TIMESTAMP(CURDATE())和UNIX_TIMESTAMP(DATE_ADD(CURDATE(),间隔5天))

我不得不使用UNIX_TIMESTAMP,因为一天的变化,即5月31日至6月5日(5年不大于31),并在e.birthdate变化年。


它可以在DQL(学说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开箱即用,但there is chapter called DQL User Defined Functions in docs, which has example implementation of DATE_ADD function for MySQL

+0

这只会选择今年的记录。我需要所有年份的结果。问题是关于生日。顺便说一句,thanx为学说的例子,但我使用Doctrine 2. – 2011-05-31 13:22:37

+0

编辑答案,所以它不检查年份(当然,生日是每年;))。 – Xaerxess 2011-05-31 13:38:51

+0

谢谢!这就是诀窍! – 2011-05-31 14:41:48

0

嗯...我没有测试它,但可以给一个尝试...

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 
+0

这并没有考虑到我不想选择年份。因为我想选择生日,所以它应该与年份无关。 – 2011-05-31 13:24:07

1
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

以上查询完全由我测试其工作正常....... – Rittika 2012-04-27 08:36:40