在SQL Server中将nvarchar ISO-8601日期转换为datetime

问题描述:

希望能够快速完成此操作。在SQL Server中将nvarchar ISO-8601日期转换为datetime

的下面不工作:

DECLARE @stringDate nvarchar(50) 
SET @stringDate = '0001-01-01T12:00:00' 

SELECT 
    @stringDate AS StringDate, 
    CONVERT(datetime, @stringDate, 126) AS ConvertedDate 

产生错误:一个nvarchar数据类型为datetime数据类型的转换导致外的范围内的值。

实现转换的最简单方法是什么?

感谢

类型Datetime不支持0001年支持的范围是1753至9999
您也可以使用类型DateTime2代替

SELECT 
    @stringDate AS StringDate, 
    CONVERT(datetime2, @stringDate, 126) AS ConvertedDate 
+0

作品一种享受!谢谢 – NiceYellowEgg 2012-04-18 11:07:06

+0

SQL Server 2008 **中的'DATE'或'DATETIME2'数据类型将**支持'01/01/0001'日期..... – 2012-04-18 11:24:35

+0

@marc_s yes,'DateTime2'正如我在答案中提到的... – Magnus 2012-04-18 11:27:57

,因为没有工作的解决方法, DATETIME data type

Date range [is] January 1, 1753, through December 31, 9999.

您必须使用new data type DATETIME2

SET ANSI_WARNINGS OFF; --Not recommended 
SET ARITHABORT OFF;  --Not recommended 
DECLARE @stringDate nvarchar(50) 
SET @stringDate = '0001-01-01T12:00:00' 

SELECT 
    @stringDate AS StringDate, 
    CONVERT(datetime, @stringDate, 126) AS Converted_DATETIME, 
    CONVERT(datetime2, @stringDate, 126) AS Converted_DATETIME2_A, 
    CONVERT(datetime2(0), @stringDate, 126) AS Converted_DATETIME2_B 

结果:

StringDate   Converted_DATETIME Converted_DATETIME2_A Converted_DATETIME2_B 
------------------- ------------------ ---------------------- ---------------------- 
0001-01-01T12:00:00 NULL    0001-01-01 12:00:00.00 0001-01-01 12:00:00 
Arithmetic overflow occurred. 

注意:您可以更改DATETIME2数据类型的默认精度,如果您的日期/时间值不具有 “小数秒精度”:DATETIME2(0)