sql显示开始日期和结束日期之间的日期

时间:2011-12-02 04:30:31

标签: mysql 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任何一年,它必须在查询结果中。

现在我没有结果。

有人有提示要解决这类问题吗?感谢。

1 个答案:

答案 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 ) ) );