错误的日期差异

时间:2014-07-17 11:25:09

标签: oracle oracle10g

我有一个函数(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;

结果是错误的。它显示出错误的差异。

1 个答案:

答案 0 :(得分:3)

previous question中,您说datetrxDATE,因此您不应将其用作to_date()的参数。您正在对字符串进行隐式转换,然后进行显式转换。从该问题来看,NLS_DATE_FORMAT似乎是dd/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;

你也有可能想要比较7月11日而不是11月7日,即使你的NLS_DATE_FORMAT实际上是mm/dd/yyyy,也会给你错误的结果。没有任何样本数据和预期和实际结果,无法判断。