将datetimeoffset数据类型转换为datetime数据类型导致值超出范围。

6
使用 SQL Server 2008。我有一个名为 User 的表,其中有一列 LastLogindata,该列具有 datetimeoffset 数据类型。
下面的查询在生产服务器上运行正常,但在复制服务器上不起作用。
select top 10 CAST(LastLoginDate AS DATETIME)  from User.

我遇到了以下错误信息:"将datetimeoffset数据类型转换为datetime数据类型时,结果超出范围。" 谢谢。

其他机器可能有不同的默认日期格式。它可能试图将像20这样的数字转换为月份。 - Steve Wellens
生产服务器版本:Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64),发布于2010年4月2日15:48:46,版权所有(c)微软公司,标准版(64位)运行在Windows NT 6.1 <X64> (Build 7600: ) (Hypervisor)上。 - paraaku chiraaku
你能否发布列LastLogindata的样本数据? - praveen
2
看起来像是服务包2引起了问题。 - paraaku chiraaku
刚刚遇到了一个类似的错误,尝试将日期和一些字符串转换为datetime。在SSMS和pymssql中查询正常运行,但在ODBC和JDBC中出现错误。这只发生在升级到SQL Server 2008 R2 SP2(10.50.4000.0)之后,并且在CU2(10.50.4263.0)中仍未修复。SQL Server是如此灾难性的失败。 - sayap
显示剩余5条评论
4个回答

4

检查LastLoginDate列的值是否为'0001-01-01'或'0001/01/01'。

如果你遇到了这个错误..

尝试这个方法

select top 10  CAST(CASE when cast(LastLoginDate  as varchar) = '0001-01-01 00:00:00' 
                         THEN NULL ELSE GETDATE() end AS DATETIME) from User

1
如果数据库中的字段是datetimeoffset类型,则应包含范围内的日期0001-01-01至9999-12-31。我认为问题在于您数据库中的日期。
请检查SQL服务器的官方链接点击这里

0

在 SQL Server 2016 上,我使用了:

CONVERT(DATETIME2, DateValueColumn) 

对于那些在转换为DATETIME时出现错误的值,提示“将datetimeoffset数据类型转换为datetime数据类型导致超出范围的值”的消息,这个方法是有效的。有问题的值具有0001-01-01的日期,正如之前的答案所提到的。

不确定这是否适用于SQL Server 2008。


0
我是这样解决的。我将一个 nvarchar(max) 列强制转换为 xml,并在 where 子句中使用了 T-SQL 表达式 ISDATE() 来排除错误行。
where cast(DataObject as xml).value('(/DataObjects/@LastLoginDate)[1]', 'varchar(10)') is not null
and isdate(cast(DataObject as xml).value('(/DataObjects/@LastLoginDate)[1]', 'varchar(10)')) = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接