Sql server 正在解决SQL Server 2012中带有datetime的TRY_PARSE()溢出问题。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间
我最近开始将查询更改为使用Sql server 正在解决SQL Server 2012中带有datetime的TRY_PARSE()溢出问题。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我最近开始将查询更改为使用TRY_PARSE(),但当结果日期早于1753年时,我遇到了一个问题。例如: SELECT TRY_PARSE('01-Jan-0001' AS datetime) 导致.NET错误: Msg 6521, Level 16, State 1, Line 1 A .NET Framework error occurred during statement execution: System.Data.SqlTypes.SqlTypeException: SqlDat
TRY_PARSE()
,但当结果日期早于1753年时,我遇到了一个问题。例如:
SELECT TRY_PARSE('01-Jan-0001' AS datetime)
导致.NET错误:
Msg 6521, Level 16, State 1, Line 1
A .NET Framework error occurred during statement execution:
System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
System.Data.SqlTypes.SqlTypeException:
at System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan value)
at System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value)
at System.Data.SqlServer.Internal.CXVariantBase.DateTimeToSSDate(DateTime dt)
我猜SQL只是在运行一个直接的.NETDateTime.TryParse()
,并直接转换为SqlDateTime
,在这种情况下,没有检查并返回NULL
(正如我所期望的那样)。我会检查我自己,但这里的第22个问题是,当需要解析来检查有效性时,如何在解析之前检查日期的有效性?
.如果不需要
TRY\u PARSE
的区域性参数,可以使用TRY\u CONVERT
SELECT TRY_CONVERT(datetime, '01-Jan-0001')
使用DateTime2而不是DateTime
SELECT TRY_PARSE('01-Jan-0001' AS datetime2)
SELECT TRY_CONVERT(datetime2, '01-Jan-0001')
还有一件事
使用TRY\u CONVERT
而不是TRY\u PARSE
:
- :返回表达式的结果,转换为请求的数据类型,如果转换失败,则返回null
- :如果转换成功,则将值转换为指定的数据类型;否则,返回null
为避免溢出,只需更改为
DATETIME2
datatype。下面是两种日期数据类型的日期范围
DATETIME
日期范围:1753年1月1日至9999年12月31日DATETIME2
日期范围:0001-01-01到9999-12-31Isin
1/1/1753
表示sql server中日期时间类型的最小日期值。也就是说,sql正在抛出日期范围错误。将其替换为datetime2
类型可解决以下问题:problem@praveen我读到的问题是,如何检查字符串值是否为有效的datetime
值,而在值超出datetime
的范围时不出现异常。不幸的是,TRY\u CONVERT()
无法正常工作。就默认的本地区域性而言,区域性是必需的,尤其是当一天中的时间也是字段的一部分时。我举的例子不是真实世界。这就是说,datetime2
给我一年的时间,检查年份的datetime
转换,并尽可能迁移到datetime2
。Cool@AltonXL如果你用什么是你的“现实世界”问题来更新问题,你可能会得到不同的解决方案。
SELECT TRY_CONVERT(datetime2, '12/31/2010') AS Result;