单个sql查询,可以处理sql server中的null或value日期范围

Ton*_*ich 6 sql t-sql sql-server sql-server-2008

使用SQL Server 2008.我有一个存储过程,它有开始和结束日期作为日期范围的输入参数.

在where子句中查找具有开始日期和结束日期之间的单个 sql查询,该查询可以处理日期为空或两者都具有值的两种情况.

我不想使用IF语句.

Qua*_*noi 12

WITH    limits AS
        (
        SELECT  COALESCE(@startDate, MIN(mydate)) AS startDate, COALESCE(@endDate, MAX(mydate)) AS endDate
        FROM    mytable
        )
SELECT  m.*
FROM    limits
JOIN    mytable m
ON      mydate BETWEEN startDate AND endDate
Run Code Online (Sandbox Code Playgroud)

如果有索引mydate,这将是最有效的,因为这个条件是sargable并将使用Index Seek.

如果没有索引,则使用IFNULL其他人提出的构造.


Mit*_*eat 10

你可以这样做:

SELECT blah
FROM MyTable
WHERE 
    (@startDate IS NULL OR MyTable.StartDate >= @startDate)
    AND (@endDate IS NULL OR MyTable.EndDate <= @endDate)
Run Code Online (Sandbox Code Playgroud)

但请注意,像这样的AND子句中的大量参数可能导致错误地缓存查询计划.关于错误的查询计划和参数'嗅探',有很多问题.