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

如何计算跨天时长?Oracle SQL计算小时数出错求助

解决Oracle SQL中跨天时间差计算问题

嘿,我明白你遇到的问题了!咱们先拆解下为什么第三条结果会出错:当你用TO_DATE(t11.JAM_AWAL,'HH24:MI:SS')TO_DATE(t11.JAM_AKHIR,'HH24:MI:SS')转换时分秒字符串时,Oracle会默认把它们转换成当天的日期。所以第三条数据里的18:3008:00被当成了同一天的两个时间,算出来的差值是10.5小时(当天18:30到当天08:00的反向差值),但实际我们需要的是当天18:30到次日08:00的时间差,也就是13.5小时。

正确的解决方案

核心思路很简单:当JAM_AWAL(开始时间)晚于JAM_AKHIR(结束时间)时,说明结束时间属于第二天,需要给结束时间的日期加1天,再计算时间差。

你可以用下面的SQL语句实现:

CASE 
    WHEN TO_DATE(t11.JAM_AWAL, 'HH24:MI:SS') < TO_DATE(t11.JAM_AKHIR, 'HH24:MI:SS') 
        THEN (TO_DATE(t11.JAM_AKHIR, 'HH24:MI:SS') - TO_DATE(t11.JAM_AWAL, 'HH24:MI:SS')) * 24
    ELSE 
        (TO_DATE(t11.JAM_AKHIR, 'HH24:MI:SS') + 1 - TO_DATE(t11.JAM_AWAL, 'HH24:MI:SS')) * 24
END AS SELISIH_JAM

验证你的测试用例

咱们挨个核对结果:

  • 第1条:16:30 → 18:30,属于同一天,计算(18:30-16:30)*24=2,正确。
  • 第2条:18:30 → 06:30,跨天,计算(06:30+1天 -18:30)*24=12,正确。
  • 第3条:18:30 → 08:00,跨天,计算(08:00+1天 -18:30)*24=13.5,这正是你需要的正确结果!

为什么之前的CASE语句失效?

你之前的CASE语句只是用ABS取了绝对值,但本质上还是在计算同一天两个时间的差值,没有处理跨天的日期偏移,所以第三条数据依然会得到错误的10.5小时。

内容的提问来源于stack exchange,提问作者Audina Tira

火山引擎 最新活动