98

我有一张如下表:

Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss

如何计算 Oracle SQL 中两个日期之间的小时、分钟和秒(可能还有天)的差异?

谢谢

4

20 回答 20

134

您可以在 Oracle 中减去日期。这会给你带来天数的差异。乘以 24 得到小时,依此类推。

SQL> select oldest - creation from my_table;

如果您的日期存储为字符数据,则必须先将其转换为日期类型。

SQL> select 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') 
             - to_date('2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours 
       from dual;

DIFF_HOURS
----------
       2.5

注意

此答案适用于由 Oracle 数据类型表示的日期DATE。Oracle 还有一种数据类型TIMESTAMP,它也可以表示日期(带时间)。如果你减去TIMESTAMP值,你会得到一个INTERVAL; 要提取数值,请使用该EXTRACT函数。

于 2009-07-08T08:44:02.573 回答
25

要在几秒钟内获得结果:

select (END_DT - START_DT)*60*60*24 from MY_TABLE;

检查 [ https://community.oracle.com/thread/2145099?tstart=0][1]

于 2015-10-29T18:30:50.523 回答
16
declare
strTime1 varchar2(50) := '02/08/2013 01:09:42 PM';
strTime2 varchar2(50) := '02/08/2013 11:09:00 PM';
v_date1 date := to_date(strTime1,'DD/MM/YYYY HH:MI:SS PM');
v_date2 date := to_date(strTime2,'DD/MM/YYYY HH:MI:SS PM');
difrence_In_Hours number;
difrence_In_minutes number;
difrence_In_seconds number;
begin
    difrence_In_Hours   := (v_date2 - v_date1) * 24;
    difrence_In_minutes := difrence_In_Hours * 60;
    difrence_In_seconds := difrence_In_minutes * 60;

    dbms_output.put_line(strTime1);        
    dbms_output.put_line(strTime2);
    dbms_output.put_line('*******');
    dbms_output.put_line('difrence_In_Hours  : ' || difrence_In_Hours);
    dbms_output.put_line('difrence_In_minutes: ' || difrence_In_minutes);
    dbms_output.put_line('difrence_In_seconds: ' || difrence_In_seconds);        
end ;

希望这可以帮助。

于 2013-02-09T10:46:40.633 回答
14
select 
    extract( day from diff ) Days, 
    extract( hour from diff ) Hours, 
    extract( minute from diff ) Minutes 
from (
        select (CAST(creationdate as timestamp) - CAST(oldcreationdate as timestamp)) diff   
        from [TableName] 
     );

这将为您提供三列,分别为天、小时和分钟。

于 2014-11-27T09:18:34.357 回答
8

你也可以试试这个:

select to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+(end_date - start_date),'hh24:mi:ss')
       as run_time from some_table;

它以更易于阅读的形式显示时间,例如:00:01:34。如果您还需要几天,您可以简单地将 DD 添加到最后一个格式化字符串。

于 2015-01-30T09:27:54.460 回答
7

您可以使用 to_timestamp 函数将日期转换为时间戳并执行减法操作。

就像是:

SELECT 
TO_TIMESTAMP ('13.10.1990 00:00:00','DD.MM.YYYY HH24:MI:SS')  - 
TO_TIMESTAMP ('01.01.1990:00:10:00','DD.MM.YYYY:HH24:MI:SS')
FROM DUAL
于 2009-07-08T09:24:32.680 回答
5

计算从 HIREDATE 到计算机系统日期的年龄

SELECT HIREDATE||'        '||SYSDATE||'       ' ||
TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) ||' YEARS '||
TRUNC((MONTHS_BETWEEN(SYSDATE,HIREDATE))-(TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)*12))||
'MONTHS' AS "AGE  "  FROM EMP;
于 2012-10-07T12:56:05.017 回答
4

在甲骨文 11g

SELECT end_date - start_date AS day_diff FROM tablexxx
suppose the starT_date end_date is define in the tablexxx
于 2015-10-07T17:04:44.537 回答
3
select days||' '|| time from (
SELECT to_number( to_char(to_date('1','J') +
    (CLOSED_DATE - CREATED_DATE), 'J') - 1)  days,
   to_char(to_date('00:00:00','HH24:MI:SS') +
      (CLOSED_DATE - CREATED_DATE), 'HH24:MI:SS') time
 FROM  request  where REQUEST_ID=158761088 );
于 2014-04-03T06:26:31.403 回答
2

如果你想要一些看起来更简单的东西,试试这个来查找过去 1 分钟内发生的表中的事件:

使用此条目,您可以摆弄十进制值,直到获得所需的分钟值。就 sysdate 有效数字而言,值 .0007 恰好是 1 分钟。您可以使用它的倍数来获得您想要的任何其他值:

select (sysdate - (sysdate - .0007)) * 1440 from dual;

结果为 1(分钟)

然后检查是一件简单的事情

select * from my_table where (sysdate - transdate) < .00071;
于 2016-08-29T15:00:47.820 回答
2

如果您从“ your_table ”中选择两个日期并希望将结果作为单列输出查看(例如“ days - hh:mm:ss ”),您可以使用类似的内容。首先,您可以计算这两个日期之间的间隔,然后从该间隔导出您需要的所有数据:

         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'))
     from    your_table

这应该会给你这样的结果: 0天 - 1:14:55

于 2018-06-05T08:08:37.153 回答
1
select (floor(((DATE2-DATE1)*24*60*60)/3600)|| ' : ' ||floor((((DATE2-DATE1)*24*60*60) -floor(((DATE2-DATE1)*24*60*60)/3600)*3600)/60)|| '  ' ) as time_difference from TABLE1 
于 2014-07-28T12:38:02.230 回答
1
(TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*60*24 sum_seconds,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*24 sum_minutes,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*24 sum_hours,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi')) sum_days 
于 2016-10-25T07:28:48.373 回答
1
select to_char(actual_start_date,'DD-MON-YYYY hh24:mi:ss') start_time,
to_char(actual_completion_date,'DD-MON-YYYY hh24:mi:ss') end_time,
floor((actual_completion_date-actual_start_date)*24*60)||'.'||round(mod((actual_completion_date-actual_start_date)*24*60*60,60)) diff_time
from fnd_concurrent_requests 
order by request_id desc;  
于 2019-11-24T10:02:45.000 回答
0

这是另一种选择:

with tbl_demo AS
    (SELECT TO_DATE('11/26/2013 13:18:50', 'MM/DD/YYYY HH24:MI:SS') dt1
   , TO_DATE('11/28/2013 21:59:12', 'MM/DD/YYYY HH24:MI:SS') dt2 
     FROM dual)
SELECT dt1
     , dt2
     , round(dt2 - dt1,2) diff_days
     , round(dt2 - dt1,2)*24 diff_hrs
     , numtodsinterval((dt2 - dt1),'day') diff_dd_hh_mm_ss
  from tbl_demo;
于 2014-02-14T09:09:51.243 回答
0

这将计算日期之间的时间:

SELECT
  (TO_CHAR( TRUNC (ROUND(((sysdate+1) - sysdate)*24,2))*60,'999999')
  +
  TO_CHAR(((((sysdate+1)-sysdate)*24)- TRUNC(ROUND(((sysdate+1) - sysdate)*24,2)))/100*60 *100, '09'))/60
FROM dual
于 2013-09-28T06:30:12.547 回答
0

从表 tbl 中选择 round( (tbl.Todate - tbl.fromDate) * 24 * 60 * 60 )

于 2021-02-19T05:04:05.423 回答
0

如果您想通过使用表和列来推迟日期。

SELECT TO_DATE( TO_CHAR(COLUMN_NAME_1, 'YYYY-MM-DD'), 'YYYY-MM-DD') - 
       TO_DATE(TO_CHAR(COLUMN_NAME_2, 'YYYY-MM-DD') , 'YYYY-MM-DD')  AS DATEDIFF       
FROM TABLE_NAME;
于 2019-08-21T03:59:22.247 回答
0

将返回两个时间戳列的时间差的单个查询:

select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff 
from MAIL_NOTIFICATIONS;
于 2019-06-12T17:10:16.420 回答
-1
$sql="select bsp_bp,user_name,status,
to_char(ins_date,'dd/mm/yyyy hh12:mi:ss AM'),
to_char(pickup_date,'dd/mm/yyyy hh12:mi:ss AM'),
trunc((pickup_date-ins_date)*24*60*60,2),message,status_message 
from valid_bsp_req where id >= '$id'"; 
于 2009-08-18T11:21:06.920 回答