HH中的两个日期datetype变量之间的日期差异:MM:Oracle中的SI

时间:2014-12-15 05:20:30

标签: oracle plsql

我遇到一个问题,我必须在datetype中区分两个日期HH:MM:SS AM变量。例如,如果date1存储23-DEC-2014 02:00:00 PMdate2存储24-DEC-2014 02:00:00 PM,那么date2 - date1应该返回24:00:00

我尝试了不同的to_char和同样的方法。

您能否建议我应该采取哪些措施来解决此问题。

2 个答案:

答案 0 :(得分:3)

由于您有 plain DATE,因此两个日期之间的差异以小数天表示。相关问题中解释的一些小麻醉剂可能有所帮助。

另一种方法是使用NUMTODSINTERVAL将差异转换为INTERVAL。但是,这不是开箱即用的,因为(至少11g),TO_CHAR函数不能正确支持INTERVAL

但是,作为相关答案中未提供的解决方法(或者我是否错过了?),您可以使用正确的精度转换为INTERVAL DAY TO SECOND以实现(或多或少)您要查找的内容:

这是一个例子

with testdata as (select to_date('12/12/2014 09:00:00','DD/MM/YYYY HH:MI:SS') a,
                    to_date('10/11/2014 11:30:14','DD/MM/YYYY HH:MI:SS') b from dual)

select a-b "days",
       numtodsinterval(a-b, 'DAY') "ds interval",
       CAST(numtodsinterval(a-b, 'DAY') AS INTERVAL DAY(3) TO SECOND(0))
--     ^^^^^                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--         cast to 3 digit days interval -- no fractional seconds
from testdata

制作(格式化为行以供显示):

days
31.8956712962962962962962962962962962963

ds interval
+000000031  21:29:46.000000000

CAST(NUMTODSINTERVAL(A-B,'DAY') AS INTERVAL DAY(3) TO SECOND(0))
+031 21:29:46

我不知道你是否/如何摆脱领先的标志

答案 1 :(得分:0)

也许这会有所帮助:

CREATE OR REPLACE FUNCTION get_date_diff(p_date1 IN DATE, 
                                         p_date2 IN DATE) RETURN VARCHAR2
IS
  v_seconds NUMBER;
  v_minutes NUMBER;
  v_hours   NUMBER;
  v_time    VARCHAR2(20);
BEGIN
  v_seconds := (p_date2 - p_date1) * 24 * 60 * 60;
  v_hours   := FLOOR(v_seconds / 3600);
  v_minutes := FLOOR((v_seconds - (v_hours * 3600)) / 60);
  v_seconds := FLOOR(v_seconds - (v_hours * 3600) - (v_minutes * 60));

  v_time    := CASE WHEN v_hours < 100 
                    THEN LPAD(TO_CHAR(v_hours), 2, '0')
                    ELSE TO_CHAR(v_hours)
                END || ':' ||
               LPAD(TO_CHAR(v_minutes), 2, '0') || ':' ||
               LPAD(TO_CHAR(v_seconds), 2, '0');

  RETURN v_time;
END;
/

SAMPLE INPUT

  

p_date1:​​= to_date('20 / 11/2014 11:30:45','DD / MM / YYYY HH:MI:SS')

     

p_date2:= to_date('15 / 12/2014 09:00:00','DD / MM / YYYY HH:MI:SS')

SAMPLE OUTPUT

  

597:29:15