日期算術 - 日數小時或秒的日期之間的差異

在 oracle 中,可以使用減法找到兩個 DATE 之間的差異(以天為單位和/或其中的分數):

SELECT DATE '2016-03-23' - DATE '2015-12-25' AS difference FROM DUAL;

輸出兩個日期之間的天數:

DIFFERENCE        89

和:

SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
         - TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
         AS difference
FROM   DUAL

輸出兩個日期之間的天數:

DIFFERENCE    1.0425

通過將該數字分別乘以 2424*6024*60*60 可以得到小時,分鐘或秒的差異。

可以更改上一個示例,以使用以下內容獲取兩個日期之間的天,小時,分鐘和秒:

SELECT TRUNC( difference                       ) AS days,
       TRUNC( MOD( difference * 24,       24 ) ) AS hours,
       TRUNC( MOD( difference * 24*60,    60 ) ) AS minutes,
       TRUNC( MOD( difference * 24*60*60, 60 ) ) AS seconds
FROM   (
  SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
         - TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
         AS difference
  FROM   DUAL

);

(注意:使用 TRUNC() 而不是 FLOOR() 來正確處理負差異。)

輸出:

DAYS HOURS MINUTES SECONDS
---- ----- ------- -------
   1     1       1      12

前面的例子也可以通過使用 NUMTODSINTERVAL() 將數值差轉換為間隔解決

SELECT EXTRACT( DAY    FROM difference ) AS days,
       EXTRACT( HOUR   FROM difference ) AS hours,
       EXTRACT( MINUTE FROM difference ) AS minutes,
       EXTRACT( SECOND FROM difference ) AS seconds
FROM   (
  SELECT NUMTODSINTERVAL(
           TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
             - TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' ),
           'DAY'
         ) AS difference
  FROM   DUAL
);