搜索多个日期过滤器的查询

时间:2013-07-30 12:57:25

标签: sql sql-server sql-server-2008 tsql coalesce

我需要为我的搜索页面编写一个查询。 我的过滤器看起来像这样:

@StartDateForColumn1 datetime,
@FinishDateForColumn1 datetime,
@StartDateForColumn2 datetime,
@FinishDateForColumn2 datetime,

所有这些都可以为空。如果是这样,我需要所有数据:

select * from Table1

例如:如果用户只填写@FinishDateForColumn1,则查询将为:

select * from Table1 where Column1<@FinishDateForColumn1 

所以我不想为所有条件写if-else。是否还有其他最简短的方法来为此示例编写查询?也许我需要使用coalesce,但我不知道如何在此查询中使用它。

4 个答案:

答案 0 :(得分:3)

您可以按以下方式使用coalesceisnull

select * 
from Table1 
where Column1<= isnull(@FinishDateForColumn1, Column1)

NB。这确实假设您的column1数据不包含空值。

答案 1 :(得分:1)

您可以执行以下操作,如果它是null(通过强制谓词条件为真),则基本上忽略每个参数,或者如果它存在,则在比较中使用它。

select *
from Table 1
where
  Column1 < case when @StartDateForColumn1 is null then Column1 + 1 else @StartDateForColumn1 end
  and Column1 < case when @FinishDateForColumn1 is null then Column1 + 1 else @FinishDateForColumn1 end
  and ...

答案 2 :(得分:1)

像使用ISNULL一样简单就足够了。

WHERE 
    Column1 BETWEEN 
        ISNULL(@StartDateForColumn1, CAST('1 Jan 1753' as DATETIME)) 
        AND
        ISNULL(@EndDateForColumn1, CAST('1 Jan 9999' as DATETIME))
    AND
        Column2 BETWEEN 
            ISNULL(@StartDateForColumn2, CAST('1 Jan 1753' as DATETIME)) 
            AND
            ISNULL(@EndDateForColumn2, CAST('1 Jan 9999' as DATETIME))

答案 3 :(得分:0)

以下假设您没有超出01/01/1971和31/12/2099范围的任何日期。

select * 
from Table1 
where Column1< ISNULL(@FinishDateForColumn1,'31/Dec/2099') 
and Column1 > ISNULL(@StartDateForColumn1, '01/Jan/1971')
and Column2< ISNULL(@FinishDateForColumn2,'31/Dec/2099') 
and Column2 > ISNULL(@StartDateForColumn2, '01/Jan/1971')