解决SQL Server 2012中的日期时间TRY_PARSE()溢出。必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间

时间:2014-01-21 10:12:01

标签: 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: 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是如何在解析之前检查日期的有效性,当你需要解析以检查有效性时?

3 个答案:

答案 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')