Sql server 如何将带有时区的JSON日期转换为SQL Server datetime?

Sql server 如何将带有时区的JSON日期转换为SQL Server datetime?,sql-server,json,datetime,Sql Server,Json,Datetime,我将JSON对象的输出保存在CSV文件中。我想将数据导入SQL Server。我尝试将JSON date列强制转换为SQL Server日期时间数据类型 select cast('2009-06-18T16:44:20+0000' as datetime) 这导致引发错误:从字符串转换日期和/或时间时转换失败 如何将带有时区的JSON日期转换为SQL Server datetime?据我所知,SQL Server使用冒号识别时区。您必须按如下方式重新设置时区部分的格式: SELECT CONV

我将JSON对象的输出保存在CSV文件中。我想将数据导入SQL Server。我尝试将JSON date列强制转换为SQL Server日期时间数据类型

select cast('2009-06-18T16:44:20+0000' as datetime)
这导致引发错误:从字符串转换日期和/或时间时转换失败


如何将带有时区的JSON日期转换为SQL Server datetime?

据我所知,SQL Server使用冒号识别时区。您必须按如下方式重新设置时区部分的格式:

SELECT CONVERT(datetime2, STUFF('2009-06-18T16:44:20+0000', 23, 0, ':'))

根据ISO 8601的规定,它有
YYYY-MM-DDThh:MM:ss[.nnnnn][{+-}hh:MM]
格式。

我也有类似的问题;虽然我的日期格式有点不同,但我还是遇到了同样的错误。我的解决方案是将其转换为DATETIME2值,而不仅仅是DATETIME。如果我没有看到Pawel的答案,我就不会尝试转换成DATETIME2

我得到的日期来自一个C#对象,该对象使用JSON.Net序列化为JSON。下面是一个示例SQL脚本,显示了日期时间值是什么以及如何转换它

DECLARE @effectiveDateJSON VARCHAR(MAX) = 
'{"EffectiveDate":"2017-02-07T00:00:00-06:00", "CreateDate":"2017-02-07T16:32:12.9130892-06:00"}';

SELECT *
FROM OPENJSON(@effectiveDateJSON)
WITH (EffectiveDate DATETIME2 '$.EffectiveDate',
    CreateDate DATETIME2 '$.CreateDate'
);

使用datetimeoffset数据类型?我已经尝试了datatimeoffset,但它不起作用。JSON日期有些古怪。这是一个比“批准”的解决方案好得多的解决方案。@oleg不,不是。它采用与原始问题不同的时间格式。原来的问题在时区中没有冒号。这个答案是肯定的。如果原始海报无法控制json输出,那么这个答案是无用的,而被接受的答案要好得多。