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

Nic*_*Egg 5 sql sql-server type-conversion sql-server-2008

希望这很快.

以下不起作用:

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

SELECT 
    @stringDate AS StringDate,
    CONVERT(datetime, @stringDate, 126) AS ConvertedDate
Run Code Online (Sandbox Code Playgroud)

产生错误:将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值.

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

谢谢

Mag*_*nus 7

类型Datetime不支持0001年支持的范围是1753到9999.
您也可以使用类型的解决方法DateTime2,而不是

SELECT 
    @stringDate AS StringDate,
    CONVERT(datetime2, @stringDate, 126) AS ConvertedDate
Run Code Online (Sandbox Code Playgroud)


Bog*_*ean 5

它不起作用,因为对于DATETIME数据类型

日期范围[是] 1753年1月1日至9999年12月31日。

您必须使用新的数据类型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
Run Code Online (Sandbox Code Playgroud)

结果:

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.
Run Code Online (Sandbox Code Playgroud)

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