SQL DATETIMEOFFSET (Eventdatetime ) - 从字符串

问题描述

当我尝试将值 '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,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 格式。