2011-05-31 80 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