Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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只是在运行一个直接的.NET
DateTime.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-31

Isin
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;