优化SQL日期范围查询

时间:2014-11-23 06:04:18

标签: sql-server sql-server-2008-r2

在给定参数@startDate和@endDate的情况下,尝试查询记录在提供的时间范围内发生的时间。我在下面有一个功能性的where子句,但我怀疑它可以更直接。

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用ISNULL函数解决方法,如下所示:

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

此查询将选择以下所有行:

  • 介于@startDate和@endDate之间
  • 如果@endDate为空,则在@startDate和当前日期时间之间
  • 如果@startDate为null且今天为&#39;如果@endDate为空,则为日期时间
  • 如果@startDate为null且@endDate
  • ,则在01/01/1900之间

答案 1 :(得分:0)

设置带地板和天花板的临时桌面,并在BETWEEN地板和天花板上加入桌面。将无限制条件(NULL)设置为1/1/1900和12/31/9999。最近一位同事向我展示了这一点并且有效。