Sql server 在SQL Server中,过滤一整天的项目的最佳方法是什么

Sql server 在SQL Server中,过滤一整天的项目的最佳方法是什么,sql-server,filtering,Sql Server,Filtering,在SQL Server中,我希望显示特定日期的所有项目。最好的方法是什么:DATEPART、BETWEEN或>=+='2011-05-07' 和BlogPostDate

在SQL Server中,我希望显示特定日期的所有项目。最好的方法是什么:DATEPART、BETWEEN或>=+<?所有3个都应该在功能上工作,但其中一些性能更好/更差吗

(一)

(二)

(三)

选择*
从博客帖子
其中BlogPostDate>='2011-05-07'
和BlogPostDate<'2011-05-08'

我个人更喜欢下面的DateDiff技术

DECLARE @selectedDate datetime = '2011-05-07'

SELECT * 
  FROM BlogPosts
 WHERE DateDiff(DAY,BlogPostDate, @selectedDate) = 0

在您提供的选项之外。第三,因为它既能满足需要,又能起作用

编号1不可搜索(无法使用索引)

数字2将错过有效的日期时间,如
2011-05-07 23:59:59.997
(您必须在此处使用的确切最大日期时间在
smalldatetime
datetime
datetime2(x)
之间变化)

如果您使用的是SQL Server 2008,则另一个选项是sargable

 SELECT *     
 FROM BlogPosts     
 WHERE CAST(BlogPostDate AS Date)  = '2011-05-07'
然而,我还是会选择你的3号密码 选项1)和2)都会起作用

选项3不会像您预期的那样工作,因为
datetime
的精度高于秒。因此,where条款:

WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59'
将不正确地过滤掉:

'2011-05-07 23:59:59.500'
因此,WHERE条款适用于:

WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59.997'

2)可以重写(即2011-05-07 23:59:59.999)还是失败?@John-可以重写,但方式很脆弱,使用2比3没有任何好处。如果您尝试
选择CAST('2011-05-07 23:59:59.999'作为datetime)
您将看到它被四舍五入到
2011-05-08 00:00.000
,因此您需要使用
'2011-05-07 23:59:59.997
,然后,如果您更改为
datetime2
,您需要前往并更新所有您已经完成此操作的位置!嗯,我不打算用。997DBA可能理解我在做什么,但大多数程序员都理解。正如你所说的,不管怎样,这样做没有任何好处。@AaronBertrand-谢谢!
WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59'
'2011-05-07 23:59:59.500'
WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59.997'