SQL DATETIMEOFFSET (Eventdatetime) - 从字符串转换日期 and/or 时间时转换失败

SQL DATETIMEOFFSET (Eventdatetime ) - Conversion failed when converting date and/or time from character string

当我尝试将值“2021-03-01T00:08:41.000Z”转换为 DATETIMEOFFSET 时,它成功了。但是,当我尝试将值“2021-03-01T0:08:41.000Z”转换为 DATETIMEOFFSET 时,它失败了。

经过分析,跟下面的脚本一个是无效数据。但是我需要处理这两种格式。

有人可以建议我如何将“2021-03-01T0:08:41.000Z”也存储为 DATETIMEOFFSET 值吗?

select ISDATE('2021-03-01T00:08:41.000Z')  --> 1 
select ISDATE('2021-03-01T0:08:41.000Z')   --> 0 

SQL 脚本 - T0 错误,T00:

没有错误
declare @jsonArray varchar(max) ='[{   "number": "AC100",  "eventdatetime": "2021-04-09T0:00:00+00:00",  "val": "0"}]';

WITH jsonData AS (
    SELECT  number, eventdatetime,val
    FROM OPENJSON(@jsonArray)
    WITH (
        number VARCHAR(50),
        eventdatetime DATETIMEOFFSET ,
        val VARCHAR(50)
    )
)
SELECT number, eventdatetime, val FROM jsonData WHERE val IS NOT NULL; 

您需要进行一些字符串操作来检测这种情况并进行更正。找到 'T',找到下一个 ':',如果它们之间只有一个字符,则插入一个 '0'。

以下是基于假设这是只有您正在处理的数据异常。如果数据在其他方面可能不正确,则可能需要使其更加稳健。

select x.TestDate
  , cast(case when SecondPos-FirstPos = 2 then substring(x.TestDate,1,FirstPos) + '0' + substring(x.TestDate,FirstPos+1,len(x.TestDate)) else x.TestDate end as datetimeoffset(0)) Corrected
from (
  values
  ('2021-03-01T00:08:41.000Z')
  ,('2021-03-01T0:08:41.000Z')) x (TestDate)
cross apply (
  values
  (charindex('T',TestDate), charindex(':',TestDate))
) y (FirstPos, SecondPos);

理想情况下,您当然会要求您的下游来源更正其格式并提供有效的 datetimeoffset 格式。