sql - 计算具有 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
解决方案
对于时差,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 小时或是否可以运行超过午夜。
推荐阅读
- python - 如何从使用 python 烧瓶构建的服务器的 http 200 响应中读取内容?
- css - 即使使用 z-index,伪元素也会与原始元素重叠
- javascript - 量角器,迭代元素:失败:过时的元素引用
- android - 是否可以将应用程序连接到蓝牙设备而无需配对或在搜索之前对设备一无所知?
- hive - 如何在 Hive 中保留最近的记录?
- java - 如何在 kotlin 中使用非静态方法?
- bash - Bash 别名:fork a repo 然后 cd 并安装
- php - 如何使用 PHP 通过 DI Server 连接到 Web 服务(B1WS)?
- apache - (EAI 2)名称或服务未知:mod_unique_id:无法找到“ae537564806a”的 IPv4 地址
- twilio - 如何在 android 中管理与 twilio 频道的聊天