【问题标题】:sql show date between start date and end datesql显示开始日期和结束日期之间的日期
【发布时间】:2011-12-02 04:30:31
【问题描述】:

我想知道如何比较开始日期和结束日期之间的生日日期。

现在我用这个:

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,则必须在查询结果中。

目前我没有得到任何结果。

有人有解决此类问题的提示吗?谢谢。

【问题讨论】:

  • start_dateend_date是什么数据类型?
  • select date 的可能重复项
  • 您能否提供更多关于您要完成的工作的详细信息?您是否想提前几天收到生日通知?
  • 感谢您的回复。我想要做的是根据生日在 start_date 和 end_date 之间显示结果,如果用户生日是 1931-12-15 并且 start_date 是 2011-12-01 和 end_date 是 2012-01-01 用户必须在结果中.

标签: mysql sql


【解决方案1】:

以下内容有点难看,但它说明了在 start_date 和 end_date 之间的时间跨度内发生的所有生日。如果时间跨度大于一年,那么它基本上会返回每个人,因为每个人在那个时间跨度的某个地方都有生日。如果它不到一年,但开始和结束在不同的年份它使用两个 between 子句来捕获开始时间到年末和年初到结束时间。此查询还假定 start_date 。

只要您在 DAYOFYEAR(birthday) 上有一个索引,尽管它的外观,这个查询仍然是高效的。

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

【讨论】:

  • 哇,非常感谢,我没想到我们可以在 sql 查询中使用这样的条件。