如何将SQL查询返回的秒数整数值转换为hh:mm:ss时间格式
实现方案
你可以根据你使用的SQL引擎选择对应实现方式,核心逻辑是将计算得到的平均秒数转换为时分秒格式:
MySQL
直接调用内置SEC_TO_TIME函数即可完成转换:
CASE WHEN sum(srv_grp_answd_cnt) = 0 THEN NULL ELSE SEC_TO_TIME(FLOOR(CAST(SUM(srv_grp_answd_dur) AS UNSIGNED) / CAST(sum(srv_grp_answd_cnt) AS UNSIGNED))) END AS avg_grp_answd_dur
加
FLOOR是为了避免除法得到的小数导致秒数带小数位,不需要可以去掉。
PostgreSQL
通过时间间隔转换配合格式化函数实现:
CASE WHEN sum(srv_grp_answd_cnt) = 0 THEN NULL ELSE TO_CHAR((SUM(srv_grp_answd_dur)::int / sum(srv_grp_answd_cnt)::int) * INTERVAL '1 second', 'HH24:MI:SS') END AS avg_grp_answd_dur
SQL Server
用日期偏移函数配合格式化实现:
CASE WHEN sum(srv_grp_answd_cnt) = 0 THEN NULL ELSE FORMAT(DATEADD(SECOND, CAST(SUM(srv_grp_answd_dur) AS INT) / CAST(sum(srv_grp_answd_cnt) AS INT), 0), 'HH:mm:ss') END AS avg_grp_answd_dur
全引擎通用兼容方案
手动计算时分秒后补零拼接,所有SQL引擎都可以套用这个逻辑:
CASE WHEN sum(srv_grp_answd_cnt) = 0 THEN NULL ELSE CONCAT( LPAD(CAST(FLOOR((CAST(SUM(srv_grp_answd_dur) AS INT) / CAST(sum(srv_grp_answd_cnt) AS INT)) / 3600) AS STRING), 2, '0'), ':', LPAD(CAST(FLOOR((CAST(SUM(srv_grp_answd_dur) AS INT) / CAST(sum(srv_grp_answd_cnt) AS INT) % 3600) / 60) AS STRING), 2, '0'), ':', LPAD(CAST((CAST(SUM(srv_grp_answd_dur) AS INT) / CAST(sum(srv_grp_answd_cnt) AS INT)) % 60 AS STRING), 2, '0') ) END AS avg_grp_answd_dur
如果你的平均秒数超过24小时,以上实现都支持显示大于24的小时数,不会出现时间溢出截断的问题。
内容的提问来源于stack exchange,提问作者Andreas Rigas
相关产品推荐
相关产品推荐

