2017-08-31 139 views
1

我已经编写了一个程序来查找两个日期之间的差异,并以YYYY-MM-DD格式显示结果,但遇到错误。谁可以帮我这个事?PL/SQL:两个日期之间的差异

CREATE OR REPLACE PROCEDURE DATECALCULATOR(DATE_1 IN DATE, DATE_2 IN DATE) AS 
    DATEDIFF DATE; 

BEGIN 
    DATEDIFF=TO_DATE(DATE_1,'YYYY-MM-DD')-TO_DATE(DATE_2,'YYYY-MM-DD'); 
    DBMS_OUTPUT.PUT_LINE ('Date difference is: ' || TO_DATE(DATEDIFF,'YYYY-MM-DD')); 
END; 
/

Excecute程序代码:

EXECUTE DATECALCULATOR('2017-09-10', '2010-01-01'); 
+0

你不能做到这一点。你的期望是什么? '0007-09-10'?你会考虑这个输出的闰年吗?你认为30天的“一个月”是什么? 31天?什么是“一年”? –

+0

谢谢! 应该怎么做才能得到YYYY-MM-DD格式的结果? –

+1

我的评论不清楚吗? YYYY-MM-DD是**日期**,即时间线上的某个点,日历中的某一天。两个日期之间的差异是一个时间间隔。您不能将其格式设置为YYYY-MM-DD - 至少不能以有用的方式进行格式化。为我的问题提供答案,然后您可能会得到一个丑陋解决方法的解决方案。 –

回答

1

使用的INTERVAL DAY TO SECOND类型,以获得格式+D HH24:MI:SS.FF6

CREATE OR REPLACE PROCEDURE DATECALCULATOR(
    DATE_1 IN DATE, 
    DATE_2 IN DATE 
) AS 
    DATEDIFF INTERVAL DAY(9) TO SECOND; 
BEGIN 
    DATEDIFF= (DATE_1- DATE_2) DAY(9) TO SECOND; 
    DBMS_OUTPUT.PUT_LINE('Date difference is: ' || DATEDIFF); 
END; 
/

或者,使用MONTHS_BETWEEN函数获取格式YYYY-MM-DD的区别:

CREATE OR REPLACE PROCEDURE DATECALCULATOR(
    range_end IN DATE, 
    range_start IN DATE 
) AS 
    DIFF NUMBER := TRUNC(MONTHS_BETWEEN(DATE_1, DATE_2)) - 1; 
    dt DATE := ADD_MONTHS(range_start, diff); 
    d INTEGER := TRUNC(range_end - dt); 
    dy INTEGER := EXTRACT(DAY FROM LAST_DAY(dt)); 
    m INTEGER; 
    y INTEGER; 
BEGIN 
    IF d > dy THEN 
    diff := diff + 1; 
    d := d - dy; 
    END IF; 
    m := MOD(TRUNC(diff), 12); 
    y := TRUNC(diff/12); 

    DBMS_OUTPUT.PUT_LINE('Date difference is: ' 
    || TO_CHAR(y, '0009') || '-' || TO_CHAR(m, 'FM09') || '-' || TO_CHAR(d, 'FM09') 
); 
END; 
/
+0

这个问题上的评论我试着用下面的语句执行程序 EXEC DATECALCULATOR('2017-09-10','2010-01-01'); 但我得到一个错误, ORA-01861:文字不匹配格式字符串ORA-06512:在line 1 –

+0

''2017-09-10''是不是字面的日期 - 它是一个字符串。 Oracle会隐式地尝试使用'NLS_DATE_FORMAT'会话参数作为格式掩码将其转换为日期字面值,但如果它与'YYYY-MM-DD'日期格式不匹配,则会失败。只需使用日期文字:'EXEC DATECALCULATOR(DATE'2017-09-10',DATE'2010-01-01')' – MT0

+0

它现在有效。 谢谢。 –

3

如果从另一个日期减去你会得到这两个日期之间的天计数。您不能通过to_date函数将此值转换为日期。什么日期,你想要得到的日期之间的差异例如456天它的意思是:

1 year 3 month and several days

可能是更好的回报格式化字符串值?

+0

我想要YYYY-MM-DD格式的结果。无法得到它。 –

+0

你不能那样做。请看@Wernfried Domscheit在 – HAYMbl4