Sql server 将datetimeoffset数据类型转换为datetime数据类型导致值超出范围
使用SQL Server 2008。我有一个名为User的表,其中有一列Sql server 将datetimeoffset数据类型转换为datetime数据类型导致值超出范围,sql-server,datetimeoffset,Sql Server,Datetimeoffset,使用SQL Server 2008。我有一个名为User的表,其中有一列LastLogindata,数据类型为datetimeoffset 以下查询适用于生产服务器,但不适用于复制服务器 select top 10 CAST(LastLoginDate AS DATETIME) from User. 我收到以下错误。将datetimeoffset数据类型转换为datetime数据类型导致值超出范围 谢谢检查LastLoginData列值,如“0001-01-01”或“0001/01/01”
LastLogindata
,数据类型为datetimeoffset
以下查询适用于生产服务器,但不适用于复制服务器
select top 10 CAST(LastLoginDate AS DATETIME) from User.
我收到以下错误。将datetimeoffset数据类型转换为datetime数据类型导致值超出范围
谢谢检查LastLoginData列值,如“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
如果数据库中的字段类型为
datetimeoffset
类型,则它应包含范围0001-01-01到9999-12-31的日期。我认为问题在于数据库中的日期
请检查SQL server的官方链接我是这样解决的。我将nvarchar(max)列转换为xml,并使用T-SQL表达式排除where子句中的坏行
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
另一台计算机上可能有不同的默认日期格式。它可能正在尝试将数字(如20)转换为一个月。生产服务器版本:Microsoft SQL server 2008 R2(RTM)-10.50.1600.1(X64)2010年4月2日15:48:46版权所有(c)Windows NT 6.1上的Microsoft Corporation Standard Edition(64位)(构建7600:)(虚拟机监控程序)复制服务器版本:Microsoft SQL server 2008 R2(RTM)-10.50.1600.1(X64)2010年4月2日15:48:46版权所有(c)Windows NT 6.0上的Microsoft Corporation标准版(64位)(Build 6002:Service Pack 2)(虚拟机监控程序)是否可以发布列LastLoginDait的示例数据看起来像是Service pack2导致了问题。