如何将日期时间字符串转换为DateTime在SQL Server(How to convert a

2019-09-16 16:57发布

我在这个格式的日期时间VARCHAR:2005-08-08T00:00:00 + 01:00。

  1. 这是否格式有名字吗? (它不是ISO8601。它是RFC3339?)
  2. 我怎样才能将其转换为使用Transact-SQL日期时间?

编辑以下是简要的答案,从别人输入拼凑:

  1. ISO8601与UTC的时差。 “:00 +01”如果是UTC它将与一个而不是“Z”结束。 维基百科
  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'

    SELECT @d作为输入,将(DATETIME,LEFT(@d,19),126)AS LOCALDATE,DATEADD(分,-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

Answer 1:

在SQL Server 2008可以使用datetimeoffset数据类型。

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

输出:

Result
----------------------------------
2005-08-08 00:01:00.0000000 +01:00

在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

输出:

LocalDate               OffsetMinutes UtcDate
----------------------- ------------- -----------------------
2007-08-08 00:01:00.000 60            2007-08-07 23:01:00.000


Answer 2:

你可以这样做一个真正丑陋的方式,在你第一次得到的日期,然后得到的时间,并添加偏移量为小时:

declare @d varchar(50)
set @d = '2005-08-08T00:00:00+01:00'

select Convert(datetime, left(@d, 10)) 
    + DateAdd(hour, Cast(substring(@d, 21, 2) as int), convert(datetime, substring(@d, 12, 8)))

或综合版本:

SELECT DateAdd(hour, Cast(substring(@d, 21, 2) as int), CONVERT(datetime, LEFT(@d, 19) ,127))

Final Result:
2005-08-08 01:00:00.000

如果你不需要偏移,则:

declare @d varchar(50)
set @d = '2005-08-08T00:00:00+01:00'

select Convert(datetime, left(@d, 10)) 
    +  convert(datetime, substring(@d, 12, 8))

Result:
2005-08-08 00:00:00.000


Answer 3:

它与时间区间Z ISO8601

采用

SELECT CONVERT(datetime,'2005-08-08T00:00:00',126)

见MSDN说明

编辑:我觉得这事做与我原本认为TSQL可以接受该结束的区域,但不会原来它。



Answer 4:

每所选择的答案,DATETIMEOFFSET是一个很好的解决方案。 但是,要注意SQL Server端内置的功能。 (我试图复制粘贴此为接受的答案评论,但它不会格式化代码示例)

select GETDATE(), CONVERT(datetimeoffset, GETDATE(), 127), CONVERT(varchar, convert(datetimeoffset, getdate(), 127)) 
-- Ugg! a SQL Server Bug!!!
-- 2013-08-16 12:54:54.090  2013-08-16 12:54:54.0900000 +00:00  2013-08-16 12:54:54.0900000 +0

select GETUTCDATE(),convert( datetimeoffset, GETUTCDATE(), 127), convert(varchar, convert( datetimeoffset, GETUTCDATE(), 127)) 
-- 2013-08-16 16:54:54.090  2013-08-16 16:54:54.0900000 +00:00  2013-08-16 16:54:54.0900000 +0


文章来源: How to convert a DateTime string to a DateTime in SQL Server