【问题标题】:Calculate difference between 2 date / times in Oracle SQL计算 Oracle SQL 中 2 个日期/时间之间的差异
【发布时间】:2010-11-08 23:19:18
【问题描述】:

我有一张如下表:

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 中两个日期之间的小时、分钟和秒(可能还有天)的差异?

谢谢

【问题讨论】:

标签: oracle date-arithmetic


【解决方案1】:

选择轮次( (tbl.Todate - tbl.fromDate) * 24 * 60 * 60 ) 来自表 tbl

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • 为什么将日期转换为 ISO 字符串只是为了立即将它们转换回日期?这是完全没有必要的。
    【解决方案3】:

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

    select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff 
    from MAIL_NOTIFICATIONS;
    

    【讨论】:

      【解决方案4】:
      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;  
      

      【讨论】:

        【解决方案5】:

        在甲骨文 11g 中

        SELECT end_date - start_date AS day_diff FROM tablexxx
        suppose the starT_date end_date is define in the tablexxx
        

        【讨论】:

          【解决方案6】:

          如果您从 '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

          【讨论】:

            【解决方案7】:
            (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 
            

            【讨论】:

              【解决方案8】:

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

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

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

              结果为 1(分钟)

              那么检查就很简单了

              select * from my_table where (sysdate - transdate) < .00071;
              

              【讨论】:

                【解决方案9】:

                在几秒钟内得到结果:

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

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

                【讨论】:

                  【解决方案10】:

                  您可以使用 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
                  

                  【讨论】:

                  • 我已经尝试了 to_date 和 to_timestamp 并且都在几天内给了我一个答案,四舍五入所以如果差异是 1 小时,我得到的答案是 0,将这个乘以 24 得到 0。我愿意如果我输入日期时间,则会收到正确的答案,但我不能为 25m 行执行此操作。有什么想法吗?
                  • 在时间戳之间使用减法会返回另一个时间戳,格式类似于“DAYS HOUR:MINS:SECS.milisecs”。你可以截断它以获得你需要的值
                  • 时间戳之间的减法返回一个 INTERVAL 数据类型。您可以使用 EXTRACT 函数返回间隔的各个部分,例如 select extract(hour from (timestamp '2009-12-31 14:00:00' - timestamp '2009-12-31 12:15:00')) hr从双;注意:这仅显示 HOUR 部分,因此如果差为 1 天和 1 小时,则显示 1 而不是 25。
                  【解决方案11】:
                  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 ;
                  

                  希望这会有所帮助。

                  【讨论】:

                    【解决方案12】:

                    您可以在 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 函数。

                    【讨论】:

                    • Oracle 的行为是否在某个时候发生了变化?当我从另一个日期中减去一个日期时,我得到一个 INTERVAL 数据类型,而不是简单的浮点数。
                    • @JonofAllTrades:不,当您减去 DATE 类型的值时,您会得到天数(作为 NUMBER)。但是,如果减去 TIMESTAMP 值,您将得到 INTERVALDS。可能您正在使用 TIMESTAMP 而不是 DATE 值。我编辑了答案。
                    • 请注意 - DATETIMESTAMP 数据类型都有时间(小时、分钟和秒)部分。 TIMESTAMP 还具有小数秒时间组件(以及可能的时区组件)。
                    • "这将给您以天为单位的差异。"请问可以链接到 Oracle 文档吗?
                    【解决方案13】:

                    你也可以试试这个:

                    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 添加到最后一个格式化字符串。

                    【讨论】:

                      【解决方案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] 
                           );
                      

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

                      【讨论】:

                        【解决方案15】:
                        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 
                        

                        【讨论】:

                          【解决方案16】:
                          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 );
                          

                          【讨论】:

                            【解决方案17】:

                            这是另一个选择:

                            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;
                            

                            【讨论】:

                              【解决方案18】:

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

                              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
                              

                              【讨论】:

                                【解决方案19】:

                                计算从 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;
                                

                                【讨论】:

                                  【解决方案20】:
                                  $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'"; 
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2012-09-09
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2021-11-25
                                    • 2011-08-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多