0

嗨,我在 Oracle 中创建了以下函数。我必须将 date-1 和 date-2 参数传递给函数,并且函数应该将另一个日期返回给我。

请看下面的代码。

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

该函数被编译,当我传递参数以执行该函数时,我收到以下错误“不是有效月份”。有人可以告诉我我哪里出错了吗

谢谢贾斯汀

4

1 回答 1

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似乎有点奇怪——您似乎不太可能真的想从表中获取与employee_join_date条件匹配的任意行。在不知道要求的情况下,您似乎很可能想做一些确定性的事情来获取具有最小值(或最大值)的行edit_date

其次,调用函数时,应该传入DATE参数而不是传入字符串,然后让 Oracle 使用会话的NLS_DATE_FORMAT. 如果您使用日期文字

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

或使用 a 将字符串显式转换为日期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.

于 2012-08-08T16:12:48.127 回答