MariaDB中SUM时间求和上限为838:59:59的原因咨询
问题原因及解决办法
这是MariaDB中TIME类型的取值范围限制导致的——TIME类型的最大值固定为838:59:59,当你用SEC_TO_TIME()把累计的秒数转换为TIME类型时,只要总秒数超过3020399(即8383600+5960+59),结果就会被截断到这个最大值,所以大数据量时总是得到838:59:59。
另外你SQL里还有个小问题:GROUP_BY 'category'用了单引号,这会把'category'当成字符串常量,导致所有数据都被分到同一个分组里,应该改成GROUP BY category(如果列名不是保留字)或者GROUP BY \category``。
解决办法
不要用TIME类型存储超长时长,直接计算并展示为字符串格式的时长即可:
方案1:基础版拼接时长
SELECT category, CONCAT( FLOOR(SUM(TIME_TO_SEC(TIMEDIFF(ter_ura_zakljucek, ter_ura_zacetek))) / 3600), ':', FLOOR((SUM(TIME_TO_SEC(TIMEDIFF(ter_ura_zakljucek, ter_ura_zacetek))) % 3600) / 60), ':', SUM(TIME_TO_SEC(TIMEDIFF(ter_ura_zakljucek, ter_ura_zacetek))) % 60 ) AS total_time FROM your_table_name -- 补充你的表名 GROUP BY category;
方案2:补零优化版(规范时分秒格式)
如果需要123:05:08这种带前导零的规范格式,可以嵌套子查询先计算总秒数,再格式化:
SELECT category, CONCAT( FLOOR(total_sec / 3600), ':', LPAD(FLOOR((total_sec % 3600) / 60), 2, '0'), ':', LPAD(total_sec % 60, 2, '0') ) AS total_time FROM ( SELECT category, SUM(TIME_TO_SEC(TIMEDIFF(ter_ura_zakljucek, ter_ura_zacetek))) AS total_sec FROM your_table_name -- 补充你的表名 GROUP BY category ) AS sub_query;
内容的提问来源于stack exchange,提问作者Aleš
相关产品推荐
相关产品推荐

