首页 > 解决方案 > 修改 SQL 中的 JSON 字符串(日期时间条目)

问题描述

我有一张这样的桌子:

| Id        | Data     | TimeStamp                                                         
-- Example info. Check Data EOL to see Time
| Id        | 732DC7DE-2B9D-4B91-8753-0004128B26D2 
| Data      | {"message":"Machine is down","machineId":"165ACE37-4E2C-4D44-9D14-D4D3ABK66C","machineName":"1501","ipAddress":"192.168.0.1","time":"2018-05-20T18:33:23.171"} 
| TimeStamp | 2018-05-20 18:33:23.1710000

我需要将此表中的日期时间值转换为UTC时间。

我已经弄清楚了时间戳转换。

Update ProcessEventMessage SET TimeStamp = DateADD(hour, -2, TimeStamp)

我的本地是UTC+2hIE 我必须从 json-data 中删除 2h。

但我不知道如何将json-datetime对象转换为UTC. 我尝试过这样的事情,但没有成功。我将如何完成将这些数字转换为UTC?(即删除两个小时)。

"time":"2018-05-20T18:33:23.171"

在此处阅读有关 ISO_8601的更多信息 结构:YYYY-MM-DDTHH:MM:SS.MSS

TL;DR:从 json 字符串中删除 2h

想法:这样做的一种方法是在时间中寻找T,并替换它之后的小时以减去2h。(可能的?)

编辑:

我现在有这样的 sql 表的结构化查询:

DECLARE @json NVARCHAR(MAX) = {"message":"Machine is down","machineId":"165ACE37-4E2C-4D44-9D14-F9E2CB2C2C13","machineName":"1501","ipAddress":"192.168.150.101","time":"2018-05-20T18:33:23.171"}
SELECT * FROM OPENJSON(@json) 
WITH (  message varchar(200) '$.message',
    machineId varchar(200) '$.machineId',
    machineName int '$.machineName',
    ipAddress varchar(200) '$.ipAddress',
    time datetime2(7) '$.time'
) 

我可以以某种方式使用这些变量来修改值吗?

标签: sqljsonsql-server

解决方案


DECLARE @JSON NVARCHAR(MAX)
SET @JSON = 
'{
"TMP": [    
    {"message":"Machine is down","machineId":"165ACE37-4E2C-4D44-9D14-F9E2CB2C2C13","machineName":"1501","ipAddress":"192.168.150.101","time":"2018-05-20T18:33:23.171"}]}
'
SET @JSON = JSON_MODIFY(@JSON, '$.TMP[0]', 'something')

推荐阅读