【问题标题】:Oracle Date SubtractionOracle 日期减法
【发布时间】:2009-10-01 20:28:52
【问题描述】:

如何编写一个表达式,以天、小时、分钟、秒等形式给出两个日期之间的差异?默认情况下,oracle 中减去两个日期会以小数形式返回天数。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    用途:

    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

    【讨论】:

      【解决方案2】:

      该小数是所提供的两个日期之间的天数差。您可以做一些数学运算,将其转换为天、小时、分钟、秒等。

      编辑:我知道你在找什么。我确信有一个更简单的方法,但我可能会这样做:

      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 是减法返回的天数...

      注意:这并没有真正经过测试,我想不到。

      【讨论】:

      • 我选择了这个答案,因为它简短、简洁、易于阅读。为所有答案投票——它们都有效!谢谢大家
      • 请注意,数字是浮点数,因此如果您尝试对结果运行 FLOOR 函数,可能会遇到错误(10:30:40 - 10:14:40 应该正好是 16 分钟,但天数是 0.011(1 次重复)。
      【解决方案3】:

      为什么不直接转换为时间戳并隐式使用间隔天到秒的数据类型?

      select to_timestamp(sysdate+1.1234) - to_timestamp(sysdate) diff
      from dual
      /
      
      DIFF        
      ----------- 
      1 2:57:42.0 
      

      【讨论】:

      • 只要使用NUMTODSINTERVAL函数:SELECT NUMTODSINTERVAL(1.1234, 'DAY') FROM DUAL;
      【解决方案4】:

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

      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
                      )
             )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多