【问题标题】:Select rows with date range within another date range选择日期范围在另一个日期范围内的行
【发布时间】:2011-01-11 13:44:55
【问题描述】:

我有一个帐户表,其中包含开始日期和结束日期列。我希望用户提供开始日期和结束日期,并且必须返回在用户指定的开始日期和结束日期之间的任何时间帐户处于活动状态的所有数据。

问题是,如果帐户当前仍处于活动状态,则结束日期可能为空。

如果帐户在用户指定的范围内的任何时间打开,则必须选择该帐户,这意味着即使在该范围内打开或关闭的帐户也必须包括在内。

这是我想要的图片。

黄色部分是用户输入的日期范围。绿色部分是我想要选择的。浅红色部分是我不想选择的。 G、H 和 I 末尾的箭头表示这些帐户没有结束日期。所有其他没有箭头的都有结束日期。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    因此,这相当于检查帐户开始日期是否早于用户提供的结束日期,以及帐户结束日期是否晚于用户提供的开始日期(或为空,在这种情况下我们甚至不需要检查它):

    where
        account.start_date < @user_end_date and
        (account.end_date >= @user_start_date or account.end_date is null)
    

    【讨论】:

      【解决方案2】:
      SELECT
          *
      FROM
          accounts
      WHERE
          (start_date >= :user_supplied_start AND start_date <= :user_supplied_end)
      OR
          (end_date >= :user_supplied_end AND end_date <= :user_supplied_start)
      OR
          (start_date <= :user_supplied_start AND end_date IS NULL) 
      

      【讨论】:

        【解决方案3】:
        SELECT  *
        FROM    accounts
        WHERE   start_date <= @input_end_date
                AND (end_date >= @input_start_date OR (end_date IS NULL AND NOW() >= @input_start_date))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-07
          • 1970-01-01
          • 2020-07-11
          • 1970-01-01
          • 2019-09-05
          相关资源
          最近更新 更多