首页 > 解决方案 > 如何在 OracleSQL 中减去 2 个时间戳(一个为日期,另一个为 HH24:MI 格式)并以 HH24:MI 格式获取结果

问题描述

我有一个包含两列的表,Start_time 和 SLA。

开始时间每天更新,并采用日期格式,例如 01-Jun-2021 19:15:38

SLA 列将 HH24MI 固定为 2010

我希望 1915 - 2010 为 -00:55(如 HH24MI 格式)

SELECT TO_CHAR((TO_CHAR(START_TIME,'HH24')||TO_CHAR(START_TIME,'MI'))-2010,'0000') 
FROM DUAL;

上面将给出结果为 -0095 但我希望它是 -00:55

标签: sqloracle

解决方案


将 存储start_timeDATE数据类型,将存储slaINTERVAL DAY TO SECOND数据类型:

CREATE TABLE table_name (
  start_time DATE,
  sla        INTERVAL DAY TO SECOND
);

那么您的数据将是:

INSERT INTO table_name ( start_time, sla ) VALUES (
  TO_DATE('01-Jun-2021 19:15:38', 'DD-MON-YYYY HH24:MI:SS', 'NLS_DATE_LANGUAGE=American'),
  INTERVAL '20:10:00' HOUR TO SECOND
);

而且,要找到差异,您可以使用:

SELECT start_time,
       sla,
       (start_time - TRUNC(start_time)) DAY TO SECOND - sla AS difference
FROM   table_name

哪个输出:

开始时间 服务水平协议 不同之处
2021-06-01 19:15:38 +00 20:10:00.000000 -000000000 00:54:22.000000000

如果您希望输出为格式化字符串,而不是间隔,则:

SELECT start_time,
       sla,
       CASE WHEN difference < INTERVAL '0' HOUR THEN '-' END
       || TO_CHAR( ABS( EXTRACT( HOUR FROM difference ) ), 'FM00' )
       || TO_CHAR( ABS( EXTRACT( MINUTE FROM difference ) ), 'FM00' )
         AS difference
FROM   (
  SELECT start_time,
         sla,
         (start_time - TRUNC(start_time)) DAY TO SECOND - sla AS difference
  FROM   table_name
)

哪个输出:

开始时间 服务水平协议 不同之处
2021-06-01 19:15:38 +00 20:10:00.000000 -0054

db<>在这里摆弄


推荐阅读