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

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”

使用SQL Server 2008。我有一个名为User的表,其中有一列
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导致了问题。