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

SQL Server中日期和日期时间相等性的比较,sql,sql-server,date,datetime,comparison,Sql,Sql Server,Date,Datetime,Comparison,我返回的行基于日期字段等于日期时间字段。显然,它们只有在格式为dd/MM/yyyy=dd/MM/yyyy 00:00:00时才直接匹配,但我希望忽略时间 我尝试过三种方法,它们都有效,但我想知道什么是最好的 1-CONVERTvarchar10,MyDate,103=CONVERTvarchar10,MyDateTime,103 2-MyDate=CONVERTdate,MyDateTime 3-MyDate=CASTMyDateTime作为日期 4-MyDate=DATEADDdd,DATED

我返回的行基于日期字段等于日期时间字段。显然,它们只有在格式为dd/MM/yyyy=dd/MM/yyyy 00:00:00时才直接匹配,但我希望忽略时间

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

1-CONVERTvarchar10,MyDate,103=CONVERTvarchar10,MyDateTime,103

2-MyDate=CONVERTdate,MyDateTime

3-MyDate=CASTMyDateTime作为日期

4-MyDate=DATEADDdd,DATEDIFFdd,0,MyDateTime,0

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

平均1-303ms

平均2-284ms

平均3-273ms

平均4-1745毫秒

测试样本量约为300000

这有什么原因吗?第一种选择真的是最好的选择吗


编辑:更改测试值以反映针对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天]之间。如果该列上有索引,则此查询可以使用索引查找而不是索引扫描

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

我使用的是DATEADD/DATEDIFF方法。关于close请求,我不认为这是重复的,因为这种方法与另一个问题的解决方案不符。这里的字符串转换是最快的!考虑到DATEADD/DATEDIFF,编辑过的问题这个平均值所基于的样本大小是多少?大约300,000如果您是从表中选择的,那么您的测试是有缺陷的,因为您不仅测试转换和比较,还测试执行计划、索引使用或缺少。这将有助于查看您的整个测试。此外,在函数中包装字段会使其不可压缩,这意味着如果索引有索引,则无法使用。这这是另一个很好的理由3@Nick.McDermaid这不是一个函数吗?@Salman从帖子中不清楚,但假设MyDate是一列,MyDateTime不是一列。