You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动