【问题标题】:Oracle : how to subtract two dates and get seconds of the resultOracle:如何减去两个日期并获得结果的秒数
【发布时间】:2021-12-26 22:44:19
【问题描述】:

我创建了oracle NVL function,它将减去开始和结束时间列并给出结果

但是我没有得到正确的输出值

例子


Start time- 2:33:10 

End time -2:33:20 

Actual Output - 9 seconds

Expected Output- 10 seconds

查询

NVL(TO_CHAR( table.time1,'YYYY/MM/DD HH24:MI:SS'),' ')"Time1",
NVL(TO_CHAR( table.time2,'YYYY/MM/DD HH24:MI:SS'),' ')"Time2",
NVL(dbms_lob.substr(oprm.message,4000),' ') AS "Messages",
NVL(REGEXP_SUBSTR (CAST( table.time2 AS TIMESTAMP) - CAST( table.time1 AS TIMESTAMP), '\d{2}:\d{2}:\d{2}'),' ') AS duration

【问题讨论】:

  • opa.start_time/end_time的数据类型是什么?如果它是 DATE,那么将两者相减就不可能产生几分之一秒的差异。
  • 对于 oracle 表列没有称为 datetime 的数据类型。有日期和时间戳
  • 那么不可能减去两个 DATE 类型并有一个小数秒。请提供更多详细信息。
  • 我运行了这个查询,它返回 11 - 选择 REGEXP_SUBSTR (CAST(to_date('05/24/2021 09:13:18','MM/DD/YYYY HH24:MI:SS') AS TIMESTAMP) - CAST(to_date('05/24/2021 09:13:07','MM/DD/YYYY HH24:MI:SS') AS TIMESTAMP), '\d{2}:\d{2} :\d{2}') 来自双重的 AS 持续时间。所以问题必须出在你的 UI 或其他东西上。请编辑问题并显示 opa 表的 DLL。

标签: oracle date datetime ceil


【解决方案1】:

您的数据类型很可能 TIMESTAMP 可以解释舍入问题。

您可以解决方法首先将其转换DATE(以摆脱毫秒)然后将其转换回TIMESTAMP(以便能够执行你的 regexp_substr)

此示例数据重现了您的问题

select opa.*, 
NVL(REGEXP_SUBSTR (CAST(opa.end_time AS TIMESTAMP) - CAST(opa.start_time AS TIMESTAMP), '\d{2}:\d{2}:\d{2}'),' ') AS duration,
NVL(REGEXP_SUBSTR (CAST(CAST(opa.end_time AS DATE)AS TIMESTAMP) - CAST(CAST(opa.start_time AS DATE)AS TIMESTAMP), '\d{2}:\d{2}:\d{2}'),' ') AS duration2
from tab opa;

START_TIME                           END_TIME                             DURATION                    DURATION2                   
------------------------------------ ------------------------------------ --------------------------- ---------------------------
04.05.2021 09:13:07,555000000 +02:00 04.05.2021 09:13:18,111000000 +02:00 00:00:10                    00:00:11 

【讨论】:

  • 谢谢,它成功了.....
  • 您无需转换回TIMESTAMP。您可以只减去日期并将返回值显式设置为间隔。 (CAST(opa.end_time AS DATE) - CAST(opa.start_time AS DATE)) DAY TO SECOND.
【解决方案2】:

让我看看能否帮助您了解一下您的情况。 首先让我们创建一个表

-- format the date in my current session.--
alter session set nls_date_format = 'DD-MON-YYYY HH12:MI:SS PM';

 CREATE TABLE TIME_HOLDER 
    (
      CREATED_DATE DATE 
    , SECOND_DATE DATE 
    ) 

向该表添加一些记录以开始计算差异。

SET DEFINE OFF;
Insert into TIME_HOLDER (CREATED_DATE,SECOND_DATE) values (to_date('02-NOV-2021 02:01:45 PM','DD-MON-YYYY HH12:MI:SS PM'),to_date('22-NOV-2021 02:01:52 PM','DD-MON-YYYY HH12:MI:SS PM'));

现在要开始使用两个日期列计算两个日期之间的差异,您必须使用以下内容。

select     extract (day from numtodsinterval (second_date
                                                   - add_months (created_date,
                                                                 floor (months_between (second_date,created_date))),
                                                   'day'))
             || ' days - '
             || extract (hour from numtodsinterval (second_date
                                                    - add_months (created_date,
                                                                  floor (months_between (second_date,created_date))),
                                                    'day'))
             || ':'
             || extract (minute from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
             || ':'
             || extract (second from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day')) as time_diff
     from   TIME_HOLDER

首先,您可以计算这两个日期之间的时间间隔,然后从该时间间隔导出您需要的所有数据: 希望这个例子有助于阐明如何在 oracle 中做这样的事情。

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多