【问题标题】:Time difference between two timestamps - Oracle两个时间戳之间的时间差 - Oracle
【发布时间】:2022-01-18 13:15:33
【问题描述】:

刚刚进入 Oracle。如何在Oracle中找到以下之间的时差。

to_char(CAST(b.start_time AS DATE),'dd-MON-yy hh24:mi:ss') as start_time    
to_char(CAST(b.end_time AS DATE),'dd-MON-yy hh24:mi:ss')  as end_time

我需要获取结束时间和开始时间的小时和分钟时差,意思是 (end_time - start_time)。

感谢您的帮助。

【问题讨论】:

  • 你的 start_time 和 end_time 列的数据类型是什么?
  • @Boniest,感谢您的回复,实际上以下内容有效,但我想在几小时和几分钟内完成。 (CAST(( b.end_time ) AS DATE ) - CAST((b.start_time ) AS DATE )) * 24 * 60 AS Layove ,(这只会导致几分钟)
  • 顺便说一句,TIMESTAMP(6) 是两者的数据类型

标签: sql oracle timestamp


【解决方案1】:

使用EXTRACT 找出差异的日、小时和分钟分量,然后将它们连接成一个字符串:

SELECT (EXTRACT(DAY FROM end_time - start_time)*24
       + EXTRACT(HOUR FROM end_time - start_time))
       || ':'
       || TO_CHAR(EXTRACT(MINUTE FROM end_time - start_time), 'FM00')
         AS difference
FROM   table_name

注意:如果你只解析小时和分钟,那么你将不会知道差异是否大于 24 小时。

其中,对于样本数据:

CREATE TABLE table_name (start_time TIMESTAMP(6), end_time TIMESTAMP(6) );

INSERT INTO table_name (start_time, end_time)
SELECT TRUNC(SYSTIMESTAMP), SYSTIMESTAMP FROM DUAL UNION ALL
SELECT TIMESTAMP '2022-01-01 00:00:00', TIMESTAMP '2022-01-03 00:00:00' FROM DUAL;

输出:

DIFFERENCE
14:15
48:00

db小提琴here

【讨论】:

    【解决方案2】:

    简单地做

    b.end_time - b.start_time
    

    结果是INTERVAL DAY TO SECOND 值,请参阅INTERVAL

    为了获得小时和分钟,您可以使用 SUBSTR / REGEX_SUBSTR / REGEXP_REPLACEEXTRACT

    REGEXP_REPLACE((b.end_time - b.start_time), '.*(\d{2}:\d{2}):\d{2}.*', '\1')
    
    EXTRACT(HOUR FROM (b.end_time - b.start_time))||':'||EXTRACT(minute FROM (b.end_time - b.start_time))
    

    【讨论】:

    • 如果时间间隔超过 24 小时,这将无法获得正确的小时和分钟差异。
    【解决方案3】:

    您可以在 Oracle 中减去时间。确保您的数据类型为日期时间格式,然后将其乘以 24 得到小时,24*60 得到分钟。

       (b.end_time - b.start_time) * 24    --For Hours
       (b.end_time - b.start_time) * 24*60 --For Minutes
    

    【讨论】:

      【解决方案4】:

      我取了 1970 年,然后添加了 start_date_timeend_date_time 之间的差异,需要格式 -> hh24:mi:ss

      你可以试试这个查询:

      SELECT
         TO_CHAR(TO_DATE('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') + (TO_DATE('2022-01-18 21:00', 'YYYY-MM-DD hh24:mi') - TO_DATE
                  ('2022-01-18 19:10', 'YYYY-MM-DD hh24:mi')), 'hh24:mi:ss') AS human_readable_format
      FROM
         DUAL;
      

      【讨论】:

      • 如果时差大于 24 小时,这将不起作用。
      • 好的,希望你得到解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2020-05-13
      相关资源
      最近更新 更多