【问题标题】:How can I convert a JSON date with timezone to a SQL Server datetime?如何将带时区的 JSON 日期转换为 SQL Server 日期时间?
【发布时间】:2016-08-16 19:27:39
【问题描述】:

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

select cast('2009-06-18T16:44:20+0000' as datetime)

这会引发错误:从字符串转换日期和/或时间时转换失败。

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

【问题讨论】:

  • 使用 datetimeoffset 数据类型?
  • 我已经尝试过 datatimeoffset 但它不起作用。 JSON 日期有些古怪。

标签: sql-server json datetime


【解决方案1】:

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

我获得的日期来自使用 JSON.Net 序列化为 JSON 的 C# 对象。下面是一个示例 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'
);

【讨论】:

  • 这是一个比“批准”的解决方案更好的解决方案。
  • @oleg 不,不是。它采用不同于原始问题的时间格式。原始问题在时区中没有冒号。这个答案假设它确实如此。如果原始发布者无法控制 json 输出,则此答案是无用的,并且接受的答案要好得多。
【解决方案2】:

据我所知,SQL Server 用冒号识别时区。您必须重新格式化时区部分,如下所示:

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

根据MSDN,ISO 8601 具有YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] 格式。

【讨论】:

    【解决方案3】:

    对于时区感知转换

    declare @offset datetimeoffset = JSON_VALUE('{"d": "2021-01-01T00:00:00+03:00"}', '$.d')
    
    declare @inCurrentTimezone datetime = @offset AT TIME ZONE CURRENT_TIMEZONE_ID()
    
    select @inCurrentTimezone
    

    文档:AT TIME ZONE, datetimeoffset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-17
      • 2019-05-30
      • 1970-01-01
      • 2012-08-14
      • 2013-09-20
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多