SQL修改和替换JSON字符串值

时间:2018-06-20 08:19:07

标签: json sql-server tsql

是否可以通过以下方式更改sub-json-data的值?

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',
    LocalTime datetime2(7) '$.time'
) AS ChangeTime

我想更改我创建的LocalTime变量,然后替换当前变量。

我想从$ .time参数中删除两个小时。

类似的东西:

UPDATE Table SET ChangeTime.LocalTime = DATEADD(hour,-2,ChangeTime.LocalTime)

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

输出: "time":"2018-05-20T16:33:23.171"

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用JSON_MODIFY

  

更新JSON字符串中的属性值,并返回更新的JSON字符串。

SET @json=JSON_MODIFY(@json,'$.time',
   FORMAT(DATEADD(hour,-2,JSON_VALUE(@json,'$.time')),'yyyy-MM-ddTHH:mm:ss.fff'));

SELECT * FROM OPENJSON(@json) 
WITH (  message varchar(200) '$.message',
    machineId varchar(200) '$.machineId',
    machineName int '$.machineName',
    ipAddress varchar(200) '$.ipAddress',
    LocalTime datetime2(7) '$.time'
) AS ChangeTime;

DBFIddle Demo

答案 1 :(得分:0)

也许是这样的:

LocalTime - INTERVAL '2 hours'

您可以间隔或删除任何时间面额。像几天,几个月,几年,几秒钟等等

WITH (  message varchar(200) '$.message',
    machineId varchar(200) '$.machineId',
    machineName int '$.machineName',
    ipAddress varchar(200) '$.ipAddress',
    LocalTime datetime2(7) '$.time'
) AS ChangeTime
SELECT LocalTime - INTERVAL '2 hours'
FROM ChangeTime