选择日期范围在另一个日期范围内的行

时间:2011-01-11 13:44:56

标签: sql sql-server

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

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

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

这是我想要的照片。

alt text

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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) 

答案 2 :(得分:0)

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