如何在SQL中计算并格式化输出包含时、分、秒的时间差?
没问题!要把时间差格式成你想要的12小时10分钟20秒这种带时分秒的形式,咱们得先把两个时间的差拆解成小时、分钟、秒三个部分,再拼接成字符串就行。不同SQL数据库的写法略有差异,我给你分常见的两种情况说明:
MySQL 实现方式
你当前用的TIMESTAMPDIFF只能取单一维度,那咱们先把时间差转换成总秒数,再拆解成时分秒:
SELECT *, CONCAT( -- 计算小时:总秒数除以3600取整 FLOOR(TIMESTAMPDIFF(SECOND, created_at, updated_at) / 3600), '小时', -- 计算分钟:总秒数模3600后除以60取整 FLOOR(MOD(TIMESTAMPDIFF(SECOND, created_at, updated_at), 3600) / 60), '分钟', -- 计算剩余秒数:总秒数模60 MOD(TIMESTAMPDIFF(SECOND, created_at, updated_at), 60), '秒' ) AS time_diff FROM attendances;
如果时间差不足1小时(比如只有25分钟10秒),上面的语句会显示0小时25分钟10秒。要是想去掉前面的0小时,可以用CASE语句做判断优化:
SELECT *, CONCAT( CASE WHEN FLOOR(TIMESTAMPDIFF(SECOND, created_at, updated_at)/3600) > 0 THEN CONCAT(FLOOR(TIMESTAMPDIFF(SECOND, created_at, updated_at)/3600), '小时') ELSE '' END, CASE WHEN FLOOR(MOD(TIMESTAMPDIFF(SECOND, created_at, updated_at),3600)/60) > 0 THEN CONCAT(FLOOR(MOD(TIMESTAMPDIFF(SECOND, created_at, updated_at),3600)/60), '分钟') ELSE '' END, MOD(TIMESTAMPDIFF(SECOND, created_at, updated_at),60), '秒' ) AS time_diff FROM attendances;
PostgreSQL 实现方式
如果用的是PostgreSQL,它没有TIMESTAMPDIFF函数,咱们可以用AGE()函数直接获取时间间隔,再提取时分秒:
SELECT *, CONCAT( EXTRACT(HOUR FROM age(updated_at, created_at)), '小时', EXTRACT(MINUTE FROM age(updated_at, created_at)), '分钟', -- 把秒转成整数避免出现小数 EXTRACT(SECOND FROM age(updated_at, created_at))::INT, '秒' ) AS time_diff FROM attendances;
同样,要是想优化掉开头的0值,逻辑和MySQL类似,用CASE判断即可。
内容的提问来源于stack exchange,提问作者Moh. Aflah Azzaky




