我有一个函数(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;
结果是错误的。它显示出错误的差异。
答案 0 :(得分:3)
在previous question中,您说datetrx
是DATE
,因此您不应将其用作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
,也会给你错误的结果。没有任何样本数据和预期和实际结果,无法判断。