优化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
答
设置一个临时用tableceiling地板和天花板,并加入到日期在地板和天花板之间的桌子上。设置您的无限条件(NULL)为1/1/1900和12/31/9999。最近一位同事向我展示了它,并发挥了作用。
我可能对此解决方案做出的一个更改是将endDate的替换值设置为“结束时间”。有关如何设置的建议? @ user3537535在他的回答中使用“12/31/9999”这样的日期建议 另一个建议使用max(myTable。[recordDate])的论坛 – OSBastard 2014-11-23 20:18:57
没错。你有一套正确的选择。我认为记录不仅仅是现在,但你是对的,你可以用'12/31/9999'代替getdate()。 – SMA 2014-11-24 07:39:47