2011-12-02 294 views
2

我想知道如何比較開始日期和結束日期之間的生日日期。sql顯示在開始日期和結束日期之間的日期

現在我用這個:

select * 
from users 
where dayofyear(birthday) between dayofyear(start_date) and dayofyear(end_date); 

的問題是,如果start_date = 2011-12-01end_date = 2012-01-01然後我沒有得到任何結果。

如果用戶的生日是1931-12-12,那麼它一定是在查詢結果中。

現在我沒有得到任何結果。

有人有提示要解決這類問題嗎?謝謝。

+0

什麼數據類型是'start_date'和'end_date'? – Anthony

+0

[select date]可能的重複(http://stackoverflow.com/questions/1080207/mysql-select-all-data-between-two-dates) – punit

+0

你能提供更多關於你想要完成的細節嗎?你是否想提前兩天通知生日? –

回答

2

以下是有點難看,但它佔所有生日在start_date和end_date之間的時間跨度發生的。如果時間跨度大於一年,那麼它基本上會返回每個人,因爲在那段時間內每個人都有一個生日。如果它不到一年但開始和結束在不同的年份它使用兩個條款之間的兩個捕獲開始時間到年底和開始一年到結束時間。此查詢還假定start_date < = end_date

只要您在DAYOFYEAR(生日)上有一個索引,即使它出現,該查詢也是高性能的。

SET @start_date = '2011-12-01'; 
SET @end_date = '2012-01-01'; 

SELECT * FROM users 
WHERE DAYOFYEAR(birthday) 
    BETWEEN IF(YEAR(@end_date) - YEAR(@start_date) > 1, 1, 
    IF(YEAR(@end_date) - YEAR(@start_date) > 0, 
     IF(DAYOFYEAR(@start_date) <= DAYOFYEAR(@end_date), 1, 
     DAYOFYEAR(@start_date)), 
     DAYOFYEAR(@start_date))) 
     AND IF(YEAR(@end_date) - YEAR(@start_date) > 1, 366, 
      IF(YEAR(@end_date) - YEAR(@start_date) > 0, 366, 
       DAYOFYEAR(@end_date))) 
    OR DAYOFYEAR(birthday) 
    BETWEEN IF(YEAR(@end_date) - YEAR(@start_date) > 1, 1, 
    IF(YEAR(@end_date) - YEAR(@start_date) > 0, 1, 
     DAYOFYEAR(@start_date))) 
     AND IF(YEAR(@end_date) - YEAR(@start_date) > 1, 366, 
       IF(YEAR(@end_date) - YEAR(@start_date) > 0, 
       IF(DAYOFYEAR(@start_date) <= DAYOFYEAR(@end_date), 366, 
        DAYOFYEAR(@end_date)), 
       DAYOFYEAR(@end_date))); 
+0

哇,非常感謝,我從未想到我們可以在sql查詢中使用這樣的條件。 – neimad

相關問題