我正在尝试找出最有效(最佳性能)的方法来检查当前日期的日期字段.目前我们正在使用:
SELECT COUNT(Job) AS Jobs FROM dbo.Job WHERE (Received BETWEEN DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0) AND DATEADD(d, DATEDIFF(d, 0, GETDATE()), 1))
Tomalak.. 13
WHERE DateDiff(d, Received, GETDATE()) = 0
编辑:正如本答案的评论中所述,这不是一个理想的解决方案.检查这个帖子中的其他答案.
WHERE DateDiff(d, Received, GETDATE()) = 0
编辑:正如本答案的评论中所述,这不是一个理想的解决方案.检查这个帖子中的其他答案.
如果您只想查找今天收到日期的所有记录,并且有未来收到日期的记录,那么您正在做的(非常非常轻微)错误...因为Between运算符允许相等的值到结束边界,所以你可以获得收到日期=明天午夜的记录......
如果不需要在Received上使用索引,那么您需要做的就是检查当前日期时间的日期差异为0 ...
Where DateDiff(day, received, getdate()) = 0
这个谓词当然不是SARGable所以它不能使用索引...如果这是这个查询的问题那么,假设你以后不能有收到的日期,我会用它代替......
Where Received >= DateAdd(day, DateDiff(Day, 0, getDate()), 0)
如果收到日期可以在将来,那么您可能会尽可能接近最高效率...(除了将Between更改为> = AND <)
如果你想要性能,你想直接命中索引,每行没有任何CPU等; 因此,我将计算范围第一,然后用一个简单的WHERE查询.我不知道您使用的是什么数据库,但在SQL Server中,以下工作原理如下:
// ... where @When is the date-and-time we have (perhaps from GETDATE()) DECLARE @DayStart datetime, @DayEnd datetime SET @DayStart = CAST(FLOOR(CAST(@When as float)) as datetime) -- get day only SET @DayEnd = DATEADD(d, 1, @DayStart) SELECT COUNT(Job) AS Jobs FROM dbo.Job WHERE (Received >= @DayStart AND Received < @DayEnd)