如何将DateTime字符串转换为SQL Server中的DateTime

Col*_*lin 4 t-sql sql-server-2005 datetime-format

我有这种格式的DateTime varchar:2005-08-08T00:00:00 + 01:00.

  1. 这种格式有名字吗?(它不是ISO8601.它是RFC3339吗?)
  2. 如何使用Transact-Sql将其转换为DateTime?

编辑 这是一个总结答案,拼凑起来的其他人输入:

  1. ISO8601,与UTC的时间偏差.如果它是UTC,它将以'Z'而不是'+01:00'结束. 维基百科
  2. 您可以将其转换为本地时间或utc,如下所示:

    DECLARE @d VARCHAR(25)SET @d ='2007-08-08T00:01:00 + 01:00'SET @d ='2007-08-08T00:01:00-01:00'SET @d =' 2007-08-08T00:01:00 + 05:30'

    选择@d作为输入,CONVERT(DATETIME,LEFT(@ d,19),126)AS LocalDate,DATEADD(MINUTE,-CAST((SUBSTRING(@ d,20,1)+ RIGHT(@ d,2))AS INT),DATEADD(HOUR,-cast(SUBSTRING(@d,20%,3)AS INT),CONVERT(DATETIME,LEFT(@d,19),126)))作为UtcDate WHERE @d LIKE' _ - - _T__ :: [+ - ] : '

结果:

Input                     LocalDate               UtcDate
------------------------- ----------------------- -----------------------
2007-08-08T00:01:00+01:00 2007-08-08 00:01:00.000 2007-08-07 23:01:00.000

2007-08-08T00:01:00-01:00 2007-08-08 00:01:00.000 2007-08-08 01:01:00.000

2007-08-08T00:01:00+05:30 2007-08-08 00:01:00.000 2007-08-07 18:31:00.000
Run Code Online (Sandbox Code Playgroud)

Ant*_*ull 9

在SQL Server 2008中,您可以使用datetimeoffset数据类型.

SELECT [Result] = CONVERT(datetimeoffset, '2005-08-08T00:01:00+01:00', 127)
Run Code Online (Sandbox Code Playgroud)

输出:

Result
----------------------------------
2005-08-08 00:01:00.0000000 +01:00
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2005及更早版本中,您可以计算UTC日期和偏移量:

SELECT [LocalDate], [OffsetMinutes], [UtcDate]
FROM
(
    SELECT [IsoDate] = '2007-08-08T00:01:00+01:00'
) A
OUTER APPLY
(
    SELECT [LocalDate] = CONVERT(datetime, LEFT([IsoDate], 19), 126)
    , [OffsetMinutes] =
        CASE SUBSTRING([IsoDate], 20, 1)
            WHEN '+' THEN +1
            WHEN '-' THEN -1
        END
        * DATEDIFF(minute, 0,
            CAST(SUBSTRING([IsoDate], 21, 5) + ':00' AS datetime))
    WHERE [IsoDate] LIKE '____-__-__T__:__:__[+-]__:__'
) B
OUTER APPLY
(
    SELECT [UtcDate] = DATEADD(minute, -[OffsetMinutes], [LocalDate])
) C
Run Code Online (Sandbox Code Playgroud)

输出:

LocalDate               OffsetMinutes UtcDate
----------------------- ------------- -----------------------
2007-08-08 00:01:00.000 60            2007-08-07 23:01:00.000
Run Code Online (Sandbox Code Playgroud)