代码之家  ›  专栏  ›  技术社区  ›  Jeff

Oracle日期减法

  •  2
  • Jeff  · 技术社区  · 16 年前

    4 回复  |  直到 16 年前
        1
  •  4
  •   Rob    16 年前

    该小数点是提供的两个日期之间的天数差。你可以做一些数学运算,把它转换成天、小时、分钟、秒等等。

    编辑

    select trunc(5.3574585) days, 
           trunc(mod((5.3574585) * 24, 24)) hours, 
           trunc(mod((5.3574585) * 24 * 60, 60)) minutes, 
           trunc(mod((5.3574585) * 24 * 60 * 60, 60)) seconds 
      from dual;
    

    …其中5.3574585是减法返回的天数。。。

        2
  •  6
  •   OMG Ponies    16 年前

    SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1,
           TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2,
           TRUNC(86400*(date2-date1)) - 60*(TRUNC((86400*(date2-date1))/60)) seconds,
           TRUNC((86400*(date2-date1))/60) - 60*(TRUNC(((86400*(date2-date1))/60)/60)) minutes,
           TRUNC(((86400*(date2-date1))/60)/60) - 24*(TRUNC((((86400*(date2-date1))/60)/60)/24)) hours,
           TRUNC((((86400*(date2-date1))/60)/60)/24) days,
           TRUNC(((((86400*(date2-date1))/60)/60)/24)/7) weeks
      FROM TABLE
    

    参考: A Comparison of Oracle's DATE and TIMESTAMP Datatypes

        3
  •  4
  •   David Aldridge    16 年前

    为什么不直接转换为时间戳并隐式地使用从一天到第二天的间隔数据类型呢?

    select to_timestamp(sysdate+1.1234) - to_timestamp(sysdate) diff
    from dual
    /
    
    DIFF        
    ----------- 
    1 2:57:42.0 
    
        4
  •  3
  •   PaulJ    16 年前

    您可以将日期转换为时间戳,并使用本机功能取出各个组件。。。

    SELECT EXTRACT( DAY    FROM ( end_timestamp - start_timestamp ) )   days
         , EXTRACT( HOUR   FROM ( end_timestamp - start_timestamp ) )   hours
         , EXTRACT( MINUTE FROM ( end_timestamp - start_timestamp ) )   minutes
         , EXTRACT( SECOND FROM ( end_timestamp - start_timestamp ) )   seconds
      FROM ( SELECT TO_TIMESTAMP( TO_CHAR( start_date, 'DD/MM/YYYY HH24:MI:SS' )
                                , 'DD/MM/YYYY HH24:MI:SS' )   start_timestamp
                  , TO_TIMESTAMP( TO_CHAR( end_date, 'DD/MM/YYYY HH24:MI:SS' )
                                , 'DD/MM/YYYY HH24:MI:SS' )   end_timestamp
               FROM ( SELECT TO_DATE( '01/10/2009 14:25:01'
                                    , 'DD/MM/YYYY HH24:MI:SS' )   start_date
                           , TO_DATE( '03/10/2009 23:09:15'
                                    , 'DD/MM/YYYY HH24:MI:SS' )   end_date
                        FROM dual
                    )
           )