我最近开始更改查询以使用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只运行直接的.NET DateTime.TryParse()
并直接转换为SqlDateTime
而不检查并在这种情况下返回NULL
(因为我希望行为是)。我会检查自己,但这里的问题22是如何在解析之前检查日期的有效性,当你需要解析以检查有效性时?
答案 0 :(得分:2)
使用DateTime2而不是DateTime
SELECT TRY_PARSE('01-Jan-0001' AS datetime2)
SELECT TRY_CONVERT(datetime2, '01-Jan-0001')
还有一件事
使用TRY_CONVERT
代替TRY_PARSE
:
TRY_PARSE
:返回表达式的结果,转换为请求的数据类型,如果转换失败,则返回null。
TRY_CONVERT
:如果转换成功,则返回转换为指定数据类型的值;否则,返回null。
SELECT TRY_CONVERT(datetime2, '12/31/2010') AS Result;
答案 1 :(得分:2)
为了避免溢出,您只需要更改为DATETIME2
数据类型。下面是两个Date数据类型的日期范围。
DATETIME
日期范围:1753年1月1日至9999年12月31日
http://msdn.microsoft.com/en-us/library/ms187819.aspx
DATETIME2
日期范围:0001-01-01至9999-12-31
http://msdn.microsoft.com/en-us/library/bb677335.aspx
答案 2 :(得分:1)
如果您不需要TRY_PARSE
的culture参数,则可以使用TRY_CONVERT
。
SELECT TRY_CONVERT(datetime, '01-Jan-0001')