将日期与日期时间进行比较是否与在SQL Server中首次将前者转换为日期时间相同?

将日期与日期时间进行比较是否与在SQL Server中首次将前者转换为日期时间相同?,sql,sql-server,date,datetime,sql-server-2012,Sql,Sql Server,Date,Datetime,Sql Server 2012,我有一个表,表中有一列,[MyDate],数据类型为DATE 我有一个变量@MyDateTime DATETIME 是以下比较: 其中[MyDate]

我有一个表,表中有一列,
[MyDate]
,数据类型为
DATE

我有一个变量
@MyDateTime DATETIME

是以下比较:
其中[MyDate]<@MyDateTime

语义上等同于:
在哪里转换(DATETIME,[MyDate])<@MyDateTime
(在SQL Server 2012中)?(这意味着两个比较将始终产生相同的结果。)如果不是,那么两个值不相同的一组值是什么


这个问题的动机是,我观察到,前一个比较允许我更有效地利用
[MyDate]
上的索引,而后一个则没有。

它们在逻辑上是等价的,但在功能上不是等价的

[MyDate] < @MyDateTime
[MyDate]<@MyDateTime

CONVERT(DATETIME, [MyDate]) < @MyDateTime
CONVERT(DATETIME,[MyDate])<@MyDateTime
但我会这样写

[MyDate] < CONVERT(DATE,@MyDateTime)
[MyDate]
这将消除一些边缘情况,即您正在进行日期与日期时间的比较,而忘记了小时和分钟;遗憾的是,在我的职业生涯中,我已经多次看到这一点(谢天谢地,这不是我的错误)


通常,如果将列包装在函数中,则函数必须应用于所有行以确定比较的有效性,因此无法最佳利用索引。但是正如Gordon Linoff所说的,索引仍然是基于我的测试使用的,并且在对索引日期列进行日期时间转换时不会变慢。

如果MyDateTime的时间为00:00:00,这是等效的,因为它们将返回相同的结果。第二个不是SARGable@scsimon当MyDateTime的时间不为00:00:00时会怎么样?从我最初的测试来看,它们还是一样的。那是因为你有<我明白了。。。另一个操作数,如=将返回不同的结果。或者,`where MyDateDime>MyDateYes,存在隐式转换。有关详细信息,请参阅SQL Server。事实证明,在将
datetime
转换为
date
时,可以使用索引。您可以称之为提供规则的异常。@GordonLinoff如果有效,那就是欺骗!我得测试一下。你可能对这个博客感兴趣:。@GordonLinoff这是一篇有趣的文章;尤其是他转发给微软的建议。在我的查询中,我使用了
[MyDate]<@MyDateTime
,因为它使用了
[MyDate]
上的索引
CONVERT(DATETIME,[MyDate])<@MyDateTime
也使用了@GordonLinoff提到的索引,但在我的例子中,估计的执行计划也使用了(非seek)谓词,因此似乎比第一次比较的效率略低。