在SQL中将ISO-8601 varchar(0000-00-00T00:00:00 + 00:00)转换为日期时间

时间:2019-08-08 11:38:36

标签: sql sql-server datetime iso8601

如何在SQL中将2019-07-01T00:00:00 + 05:30转换为DateTime?

2019-07-01T00:00:00 + 05:30是varchar字段。我需要将其转换为DateTime以便将其与日期字段进行比较。
向我建议一个将(2019-07-01T00:00:00 + 05:30)转换为DateTime的查询

5 个答案:

答案 0 :(得分:0)

转换为日期:

select cast('2019-07-01T00:00:00+05:30' as Date)

转换为时间:

select cast('2019-07-01T00:00:00+05:30' as Time)

转换为日期时间:

select convert(datetime2, '2019-07-01T10:00:30+05:30',0)

答案 1 :(得分:0)

尝试任何一种方法。

 select cast(convert(datetime2, '2019-07-01T10:00:30+05:30',0) as datetime)

 select convert(datetime2, '2019-07-01T10:00:30+05:30',0)

答案 2 :(得分:0)

一种选择是在时间戳上使用CONVERT的组合而不使用时区分量,然后在时区部分使用TODATETIMEOFFSET以获得最终结果:

WITH yourTable AS (
    SELECT '2019-07-01T00:00:00+05:30' AS dt
)

SELECT
    TODATETIMEOFFSET(CONVERT(datetime, LEFT(dt, 19), 126), RIGHT(dt, 6)) AS output
FROM yourTable;

这将输出:

01/07/2019 00:00:00 +05:30

Demo

答案 3 :(得分:0)

不幸的是,当从datetimeoffset转换为date or datetime时,SQL Server会截断时区信息。但是,您可以计算偏移量并将其添加回:

select dateadd(minute,
               datediff(minute, convert(datetimeoffset, dt), convert(datetime, convert(datetimeoffset, dt))),
               convert(datetime, convert(datetimeoffset, dt))
              )
from (values ('2019-07-01T00:00:00+05:30')) v(dt);

对于您的特定时区,午夜的日期与UTC日期匹配,因此很安全。我在世界的另一端,因此在“西方”世界(“西方”在UTC以西)中,这将是一个更重要的考虑因素。

答案 4 :(得分:0)

以下查询会将给定的VARCHAR转换为DATETIME值:

DECLARE @DateVal AS VARCHAR (30) = '2019-07-01T00:00:00+05:30';
SELECT CAST(REPLACE(SUBSTRING(@DateVal, 0, CHARINDEX('+', @DateVal)), 'T', ' ') AS DATETIME);