2011-12-02 212 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

相关问题