为什么 SQL Server 不自动将 DATE 向上转换为 DATETIME 以进行比较?

Sql*_*yan 4 sql-server datetime date sql-server-2008 sql-server-native-client

我喜欢 SQL Server 2008 中的新 DATE 数据类型,但是当我将 DATE 字段与链接服务器(在本例中为 SQL 2005)上的 DATETIME 字段进行比较时,如下所示:

DECLARE @MyDate DATE
SET @MyDate = CONVERT(DATE, GETDATE())

SELECT *
  FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable
 WHERE SomeDatetimeField < @MyDate
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

OLE DB provider "SQLNCLI10" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.".
Run Code Online (Sandbox Code Playgroud)

“比例无效”显然是因为本机客户端将 DATE 数据类型传递回链接服务器,而且由于它是 SQL 2005,它不知道如何处理它。对 2008 年服务器运行相同的查询效果很好 - SQL Server 能够毫无问题地比较 DATE 和 DATETIME 数据类型。

这是我的问题 - Native Client 不会自动将“2009-11-09”的 DATE 值转换为“2009-11-09 00:00:00.000”的 DATETIME 以便之前版本的SQL Server 不会被它呛到吗?

And*_*rew 5

datetime (2005) 和 date / time / datetime2 datetimeoffset (2008) 的内部结构彼此非常不同,并且与其他比较一样,比较时必须将数据放入相同的类型。因此,本机客户端将被迫进行这样的转换。

本机客户端可能会很慷慨,并为您进行隐式转换,但同样,产品倾向于工作的“最小惊喜元素”应该建议在 SQL 2005 中抛出它本机无法理解的类型应该被拒绝。有许多细微的错误肯定会从那个错误中溜走。

在 SQL 2005 中抛出 datetime2(7) 应该也是如此,我们是否期望它会将 100ns 的精度舍入到 3.33ms 或抛出错误 - 我更喜欢错误并进行/接受显式转换。