优化SQL日期范围查询

优化SQL日期范围查询

问题描述:

试图查询给定参数@startDate和@endDate何时在所提供的时间范围内发生一条记录。我在下面有一个功能性的条款,但我怀疑它可能更直接。优化SQL日期范围查询

如果提供了结束日期,则不会从该日期之后选择记录。如果提供开始日期,则不会在该日期之前选择记录。如果没有提供日期,则将选择所有记录。

SELECT * 
FROM myTable 
WHERE 
    (
     (@startDate IS NULL AND ((@endDate IS NULL) OR (myTable.[recordDate] <= @endDate))) 
     OR 
     (@endDate IS NULL AND ((@startDate IS NULL) OR (myTable.[recordDate] >= @startDate))) 
     OR 
     (myTable.[recordDate] BETWEEN @startDate AND @endDate) 
    ) 

您可以用ISNULL功能类似下面解决方法:

SELECT * FROM myTable 
WHERE myTable.[recordDate] >= ISNULL(@startDate, '01/01/1900') 
AND myTable.[recordDate] <= ISNULL(@endDate, getDate()) 

此查询将选择所有要么行:

  • 的@startDate和@EndDate(含)之间
  • @startDate和当前日期时间如果@endDate为空
  • 之间01/01/1900如果@startDate为null,并且今天的日期时间,如果@EndDate为null
  • 之间01/01/1900如果@startDate为null,并且@EndDate
+0

我可能对此解决方案做出的一个更改是将endDate的替换值设置为“结束时间”。有关如何设置的建议? @ user3537535在他的回答中使用“12/31/9999”这样的日期建议 另一个建议使用max(myTable。[recordDate])的论坛 – OSBastard 2014-11-23 20:18:57

+0

没错。你有一套正确的选择。我认为记录不仅仅是现在,但你是对的,你可以用'12/31/9999'代替getdate()。 – SMA 2014-11-24 07:39:47

设置一个临时用tableceiling地板和天花板,并加入到日期在地板和天花板之间的桌子上。设置您的无限条件(NULL)为1/1/1900和12/31/9999。最近一位同事向我展示了它,并发挥了作用。