我遇到一个问题,我必须在datetype
中区分两个日期HH:MM:SS AM
变量。例如,如果date1
存储23-DEC-2014 02:00:00 PM
和date2
存储24-DEC-2014 02:00:00 PM
,那么date2 - date1
应该返回24:00:00
。
我尝试了不同的to_char
和同样的方法。
您能否建议我应该采取哪些措施来解决此问题。
答案 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