繁体   English   中英

比较SQL Server中日期和日期时间的相等性

[英]Comparing equality of date and datetime in SQL Server

我基于等于datetime字段的date字段返回行。 他们显然只能在dd/MM/yyyy = dd/MM/yyyy 00:00:00的格式中直接匹配,但我希望忽略时间。

我尝试了3种方法,它们都有效,但我想知道什么是最好的。

1 - CONVERT(varchar(10),MyDate,103) = CONVERT(varchar(10),MyDateTime,103))

2 - MyDate = CONVERT(date,MyDateTime)

3 - MyDate = CAST(MyDateTime AS date)

4 - MyDate = DATEADD(dd, DATEDIFF(dd, 0, MyDateTime), 0)

对我来说,#1应该是最慢的,转换为字符串然后使用字符串比较肯定应该是最低效的。 但在测试中它是最快的! 以下是我的测试:

1 - 303ms平均

平均2 - 284毫秒

3 - 平均273毫秒

平均4 - 1745毫秒

测试的样本量约为300,000

是否有一个原因? 第一种选择真的是最好的选择吗?

编辑:更改测试值以反映为300k记录每次运行10次的测试。 更改结果以显示除了下面提到的DATEADD/DATEDIFF方法Tim Schmelter之外的所有结果都非常相似。 这似乎是效率最低的。

我会说#3是最好的选择。 这是我的理由。

您已经完成了性能工作,所以我不会重做它。 您更新的数字显示选项1-3非常相似所以我们可以将性能放在一边,除了排除#4。

一旦表现得到解决,就会有最佳实践和可读性。 #1肯定是大多数代码和最难阅读所以我会排除这一点。 同样的理由适用于已经排除的#4。

这给我们留下了#2和#3。 我的选择是#3,因为CAST是SQL标准的一部分,比CONVERT更便携。 因此,无论何时您不需要CONVERT的特殊功能,我都建议您始终使用CAST。

如果MyDate是一个参数,那么有第五个选项:

检查MyDateTime是否介于[MyDate, MyDate + 1 DAY) 如果该列上有索引,则此查询可以使用索引搜索而不是索引扫描。

DECLARE @MyDate1 AS DATETIME = '2015-01-01'              -- 2015-01-01 00:00:00
DECLARE @MyDate2 AS DATETIME = DATEADD(DAY, 1, @MyDate1) -- 2015-01-02 00:00:00
SELECT ... WHERE MyDateTime >= @MyDate1 AND MyDateTime < @MyDate2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM