当前位置:  开发笔记 > 数据库 > 正文

在sql查询的where子句中检查当前日期的最佳方法

如何解决《在sql查询的where子句中检查当前日期的最佳方法》经验,为你挑选了3个好方法。

我正在尝试找出最有效(最佳性能)的方法来检查当前日期的日期字段.目前我们正在使用:

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

编辑:正如本答案的评论中所述,这不是一个理想的解决方案.检查这个帖子中的其他答案.



1> Tomalak..:
WHERE
  DateDiff(d, Received, GETDATE()) = 0

编辑:正如本答案的评论中所述,这不是一个理想的解决方案.检查这个帖子中的其他答案.


什么是"SARG能"?
我不这样做,因为它不具备SARG能力.
这意味着可以使用索引(http://en.wikipedia.org/wiki/Sargable)来满足搜索条件.计算正在过滤的值会使操作成为非SARGable,因为计算值不在索引中.这会强制服务器单独查看每一行(=慢速).

2> Charles Bret..:

如果您只想查找今天收到日期的所有记录,并且有未来收到日期的记录,那么您正在做的(非常非常轻微)错误...因为Between运算符允许相等的值到结束边界,所以你可以获得收到日期=明天午夜的记录......

如果不需要在Received上使用索引,那么您需要做的就是检查当前日期时间的日期差异为0 ...

Where DateDiff(day, received, getdate()) = 0

这个谓词当然不是SARGable所以它不能使用索引...如果这是这个查询的问题那么,假设你以后不能有收到的日期,我会用它代替......

Where Received >= DateAdd(day, DateDiff(Day, 0, getDate()), 0) 

如果收到日期可以在将来,那么您可能会尽可能接近最高效率...(除了将Between更改为> = AND <)



3> Marc Gravell..:

如果你想要性能,你想直接命中索引,每行没有任何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)

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有