【问题标题】:SQL modify and replace json string-valueSQL修改替换json字符串值
【发布时间】:2018-06-20 08:19:07
【问题描述】:

是否可以通过以下方式更改 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"

我将如何做到这一点?

【问题讨论】:

    标签: json sql-server tsql


    【解决方案1】:

    你可以使用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

    【讨论】:

    • 完美!但是,我将如何执行查询来替换当前的 db-entry?
    • @Joel 完全一样。只需输入UPDATE tab SET my_json_column = JSON_MODIFY(my_json_column,'$.time', FORMAT(DATEADD(hour,-2,JSON_VALUE(my_json_column,'$.time')),'yyyy-MM-ddTHH:mm:ss.fff'))
    【解决方案2】:

    可能是这样的:

    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
    

    【讨论】:

    • 我会调查的。但是,我遇到的一个问题是没有像 ChangeTime.LocalTime 这样的变量。我将如何访问with 子句中的参数?
    • 你不能在 with 之外更新它吗?我会更新我的答案,等等
    • 是的,现在我只是将 JSON 数据解析为对象,这样我就可以在现场运行DATEADD。之后我想用新值替换(或更新)当前条目
    • 抱歉,我仍然无法访问 with 子句中的任何变量。
    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2021-12-13
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多