2012-08-08 45 views
0

嗨我在Oracle中创建了以下函数。 我将不得不将date-1和date-2参数传递给函数,函数应该返回另一个日期给我。从Oracle函数返回数据?

请参阅下面的代码。

create or replace function GETD(p_d1 in date, 
           p_d2 in date) return DATE 
    as 
     l_result DATE; 
    begin 
    SELECT EDIT_Date into l_result FROM qa.employees WHERE qa.employee_join_date BETWEEN TO_DATE(p_d1, 'MM/DD/YYYY') AND TO_DATE(p_d2, 'MM/DD/YYYY') AND ROWNUM <= 1 
    ; 
     return l_result; 
    end; 

我执行的功能如下

SELECT GETD('27-JUN-12','28-JUN-12') FROM DUAL 

被编译的功能,而IM的参数并执行功能我得到以下错误“不是有效的月份”。 能有一个人请告诉我,我去错了

感谢 贾斯汀

回答

1

首先,你不应该在一个日期变量调用TO_DATE。如果这样做,则强制Oracle首先使用会话的NLS_DATE_FORMAT将日期转换为字符串,然后使用指定的格式掩码将字符串转换回日期。如果您的NLS_DATE_FORMAT发生与指定的格式掩码不匹配(并且由于NLS_DATE_FORMAT由客户端控制,某些用户和会话将不可避免地具有不同的日期格式),您将收到错误消息。

假设您的意图仅仅是忽略任何时间组件,您应该使用trunc函数。

create or replace function GETD(p_d1 in date, 
           p_d2 in date) 
    return DATE 
as 
    l_result DATE; 
begin 
    SELECT EDIT_Date 
    into l_result 
    FROM qa.employees 
    WHERE qa.employee_join_date BETWEEN trunc(p_d1) AND trunc(p_d2) 
    AND ROWNUM <= 1; 

    return l_result; 
end; 

rownum <= 1状况的存在似乎有点odd--似乎不太可能,你真的想从匹配employee_join_date标准表中提取的任意行。不知道需求,看起来你可能想要做一些确定性的事情,以最小(或最大)edit_date来获取行。其次,当你调用这个函数时,你应该传递参数DATE而不是传入字符串,并让Oracle使用会话的NLS_DATE_FORMAT将字符串隐式转换为日期。如果使用日期文字

SELECT GETD(date '2012-06-27', date '2012-06-28') 
    FROM DUAL 

或字符串转换为日期明确使用TO_DATE

SELECT GETD(to_date('27-JUN-12', 'DD-MON-RR'), to_date('28-JUN-12', 'DD-MON-RR')) 
    FROM DUAL 

那么您的通话将不顾客户的NLS_DATE_FORMAT的工作。

+0

谢谢巴迪它真的很有帮助.... !!! – 2012-08-08 17:55:32