You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中以hh:mm:ss格式返回航班飞行时长?

解决PostgreSQL中计算航班飞行时长的报错问题

报错原因

你遇到的错误是因为PostgreSQL没有内置的DATEDIFF函数(该函数常见于MySQL、SQL Server),同时你的子查询存在逻辑问题:该子查询返回两列数据,且如果flight表有多行,会返回多行结果,无法直接作为主查询SELECT列表中的单个字段值。

正确解决方案

要得到hh:mm:ss格式的飞行时长,我们可以利用PostgreSQL对时间戳的原生运算能力,结合格式化函数实现:

方法1:直接格式化时间间隔(适用于时长≤24小时的航班)

SELECT
    departure_city,
    arrival_city,
    -- 计算时间差并格式化为hh:mm:ss
    TO_CHAR(arrival_time - departure_time, 'HH24:MI:SS') AS flight_duration
FROM flight;

方法2:处理超过24小时的时长(通用方案)

如果存在飞行时长超过24小时的航班,上面的方法会显示天数(比如1 02:30:00),可以通过计算总秒数再转换为时分秒:

SELECT
    departure_city,
    arrival_city,
    TO_CHAR(
        MAKE_INTERVAL(seconds => EXTRACT(EPOCH FROM (arrival_time - departure_time))),
        'HH24:MI:SS'
    ) AS flight_duration
FROM flight;

方法3:手动拼接时分秒(更灵活)

通过提取小时、分钟、秒分量,手动拼接成目标格式:

SELECT
    departure_city,
    arrival_city,
    CONCAT(
        LPAD(CAST(EXTRACT(HOUR FROM (arrival_time - departure_time)) AS TEXT), 2, '0'),
        ':',
        LPAD(CAST(EXTRACT(MINUTE FROM (arrival_time - departure_time)) AS TEXT), 2, '0'),
        ':',
        LPAD(CAST(ROUND(EXTRACT(SECOND FROM (arrival_time - departure_time))) AS TEXT), 2, '0')
    ) AS flight_duration
FROM flight;

原SQL的其他问题修正

原SQL中的子查询完全多余,主查询中可以直接对departure_time和arrival_time进行类型转换,比如:

SELECT
    departure_city,
    arrival_city,
    TO_CHAR(arrival_time - departure_time, 'HH24:MI:SS') AS flight_duration,
    CAST(arrival_time AS TIME) AS arrival_time_only,
    CAST(departure_time AS TIME) AS departure_time_only
FROM flight;

内容的提问来源于stack exchange,提问作者paulo sampieri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:27:44