如何将JSON_QUERY查询的数组列中的日期格式化为仅时间
如何将JSON数组列中的日期时间格式化为仅保留时间部分
嘿,针对你这个用JSON_QUERY得到的日期时间数组列,我给你分享两种实用的SQL解决方案(默认是SQL Server环境,因为你用到了JSON_QUERY):
方法1:拆分重组数组(兼容大多数SQL Server版本)
这种方法适合所有支持OPENJSON和STRING_AGG的SQL Server版本(2016及以上),步骤是先拆分JSON数组为单个元素,处理时间格式后再重新组合成数组:
SELECT -- 把处理后的时间元素重新拼成JSON数组 JSON_QUERY('[' + STRING_AGG(JSON_QUOTES(CONVERT(VARCHAR(8), CAST(value AS DATETIME), 108)), ',') + ']') AS Formatted_Time_Array FROM Your_Table -- 拆分JSON数组为行数据 CROSS APPLY OPENJSON(My_Column) -- 按原表的主键分组,确保每一行的数组能正确重组 GROUP BY Your_Table.ID -- 替换成你的表主键或者唯一标识列
关键部分说明:
OPENJSON(My_Column):把JSON数组拆成一行行的日期时间字符串;CONVERT(VARCHAR(8), CAST(value AS DATETIME), 108):将字符串转成DATETIME后,用108格式码提取HH:mm:ss的时间部分(这个比FORMAT性能更高,适合大数据量);JSON_QUOTES():给每个时间字符串加上双引号,符合JSON格式要求;STRING_AGG():把处理后的时间元素拼接成逗号分隔的字符串,再用JSON_QUERY包裹成数组。
方法2:使用JSON_TRANSFORM(SQL Server 2022+)
如果你的SQL Server是2022或更高版本,直接用JSON_TRANSFORM可以一步到位,代码更简洁:
SELECT JSON_TRANSFORM( My_Column, '$.[]' = CONVERT(VARCHAR(8), CAST(@$ AS DATETIME), 108) ) AS Formatted_Time_Array FROM Your_Table
说明:
'$.[]':匹配JSON数组中的所有元素;@$:代表当前遍历到的数组元素;- 直接对每个元素进行格式转换,无需拆分重组,代码更优雅。
额外提示:
如果你的日期字符串格式不是标准ISO格式,建议用TRY_CAST替代CAST:TRY_CAST(value AS DATETIME),这样即使遇到无效值也不会导致整个查询失败。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

