2014-07-17 50 views
1

我有一个函数(daysBetween)错误日期差异

CREATE OR REPLACE FUNCTION daysBetween 
(
    p_date1 DATE, 
    p_date2 DATE 
) 
    RETURN NUMBER 
AS 
BEGIN 
    RETURN (TRUNC(p_date1) - TRUNC(p_date2)); 
END; 

有了这个功能,我有查询

SELECT COALESCE(daysBetween(to_date('11-07-2003','mm-dd-yyyy'), 
     to_date(datetrx,'mm-dd-yyyy')),0) 
from payment; 

结果wrong.it显示错误的区别。

+3

你测试了哪些数据,你期望得到什么结果(以及为什么),以及你实际得到了什么?什么数据类型是'datetrx' - date或varchar2? –

回答

3

在你的previous question你说datetrxDATE,所以你不应该使用它作为to_date()的参数。您正在对字符串进行隐式转换,然后进行显式转换。从这个问题看起来你的NLS_DATE_FORMATdd/mm/yyyy。所以,你真的这样做了第二个参数传递给函数:

to_date(to_char(datetrx, 'dd/mm/yyyy'),'mm-dd-yyyy') 

只要datetrx值的日部分是< = 12这样就会出现工作,但会给你一个不同的日期比你开始 - 当你交换日期和月份的值。这可能是你为什么从函数中得到错误答案的原因。如果一天晚于本月12日,那么它会出错。

但你并不需要把它所有的转换,只是做:作为建议

SELECT COALESCE(daysBetween(to_date('11-07-2003', 'mm-dd-yyyy'), datetrx), 0) 
from payment; 

或者使用ANSI语法前:也有可能,你想比较反对七月

SELECT COALESCE(daysBetween(date '2003-11-07', datetrx), 0) 
from payment; 

11日而不是11月7日,即使你的NLS_DATE_FORMAT实际上是mm/dd/yyyy,也会给你错误的结果。无法分析任何样本数据和预期结果以及实际结果。