首页 > 解决方案 > 计算具有 HH.MM 格式时间的两个 varchar2 列之间的时间差

问题描述

我正在尝试计算进出时间之间的时间差。

使用下面的代码时,它给出了错误的数据。

(SELECT round(24 * (to_date(SIGN_OUT_TIME,'hh24:mi') - 
to_date(SIGN_IN_TIME,'hh24:mi')),2) diff_hours
FROM XXBCT.XXBCT_BIO_OTL_ENTRIES_SUMMARY
WHERE EMPLOYEE_NUMBER='112319'
AND attendance_dt    ='04-Jan-19');

结果应该是 08.13 但它给出的是 8.22

标签: sqloracletime

解决方案


对于时差,Oracle 有一个数据类型,它被称为interval

http://www.oracletutorial.com/oracle-basics/oracle-interval/

Oracle 为您提供了两种日期时间数据类型:用于存储时间点数据的 DATE 和 TIMESTAMP。此外,它提供了允许您存储时间段的 INTERVAL 数据类型。

对我来说,这是我更喜欢处理时差的方式,因为它节省了仅处理日期时所需的所有繁琐计算。以下查询中的“技巧”是我通过将一个日期转换为时间戳to_timestamp。Atimestamp减adate给你一个interval回报:

with 
first_date_vc2   as (select                '01:00' val from dual),
second_date_vc2  as (select                '09:13' val from dual),
first_date_date  as (select to_date(val,'HH24:MI') val from first_date_vc2),
second_date_date as (select to_date(val,'HH24:MI') val from second_date_vc2)
select 
    to_timestamp(sdd.val)-fdd.val 
from first_date_date fdd,second_date_date sdd;

-- TO_TIMESTAMP(SDD.VAL)-FDD.VAL
-- +00 08:13:00.000000

包括您想要的输出格式:

with 
first_date_vc2   as (select                '01:00'        val from dual),
second_date_vc2  as (select                '09:13'        val from dual),
first_date_date  as (select to_date(val,'HH24:MI')        val from first_date_vc2),
second_date_date as (select to_date(val,'HH24:MI')        val from second_date_vc2),
interval_between as (select to_timestamp(sdd.val)-fdd.val val from first_date_date fdd,second_date_date sdd)
select 
    extract( hour from val)||':'||extract( minute from val) val
from interval_between;

-- VAL
-- 8:13

正如评论者已经指出的那样,实际需要的查询会因要求而异,例如是否可以超过 24 小时或是否可以运行超过午夜。


推荐阅读