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

ano*_*ery 6 sql sql-server comparison datetime date

我基于date等于datetime字段的字段返回行.他们显然只是在格式时直接匹配,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/DATEDIFFTim Schmelter提到的方法之外,改变结果以显示所有结果非常相似.这似乎是效率最低的.

Der*_*rik 4

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

表演工作你已经做了,我就不重做了。您更新的数字显示选项 1-3 非常相似,因此我们可以将性能放在一边,但排除#4。

一旦性能确定下来,接下来就是最佳实践和可读性。#1 对于大多数代码来说绝对是最难阅读的,所以我会排除这一点。同样的原因也适用于已经排除的#4。

这给我们留下了#2 和#3。我选择#3,因为 CAST 是 SQL 标准的一部分,并且比 CONVERT 更可移植。因此,当您不需要 CONVERT 的特殊功能时,我建议始终使用 CAST。