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

时间:2009-11-09 14:30:49

标签: sql-server sql-server-2008 datetime date sql-server-native-client

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

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

SELECT *
  FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable
 WHERE SomeDatetimeField < @MyDate

我收到此错误:

OLE DB provider "SQLNCLI10" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.".

“规模无效”显然是因为Native客户端将DATE数据类型传递回链接服务器,并且因为它是SQL 2005,所以它不知道如何处理它。对2008服务器运行相同的查询工作正常 - SQL Server能够毫无问题地比较DATE和DATETIME数据类型。

以下是我的问题 - 是否有原因导致Native Client不会自动将“2009-11-09”的DATE值转换为“2009-11-09 00:00:00.000”的DATETIME以便以前版本的SQL Server不会阻塞它?

3 个答案:

答案 0 :(得分:4)

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

本机客户端可能是慷慨的,并为您进行隐式转换,但同样地,产品倾向于工作的“最少惊喜的元素”应该建议在SQL 2005上抛出一个本身不理解的类型应该被拒绝。有一些细微的错误可以从那个错误中滑出来。

在SQL 2005中抛出datetime2(7)同样如此,我们是否期望它会将100ns精度回到3.33ms或抛出错误 - 我更喜欢错误并且接受/接受显性演员。

答案 1 :(得分:1)

我只能猜测这是因为2009-11-09 00:00:00.000不是时区中立的,会导致更微妙的错误。如果我错了,请纠正我。

答案 2 :(得分:0)

你可以通过使用来实现这一点 ALTER SESSION SET NLS_DATE_FORMAT ='MM / DD / YYYY HH:MI:SS AM';这是temproray解决方案,如果你在UNIX上工作,那么这些设置可以在.profile中永久完成。