问题描述
当我尝试将值 '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
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
格式。