比较Oracle PACKAGE中的日期类型不起作用

时间:2014-11-05 02:10:10

标签: java sql oracle date package

我制作了如下的Oracle软件包。

我将传递参数字符串,如'2014-11-05'。

--SEARCH 2014 11 04
FUNCTION SEARCHMYPAGE(v_created_after IN DATE, v_created_before IN DATE)
return CURSORTYPE is rtn_cursor CURSORTYPE; 
BEGIN
OPEN
rtn_cursor FOR
  select 
    news_id  
  from
    (
    select 
      news_id,
      news_title, news_desc,
      created, news_cd
    from
      news
    )
  where
  1=1
  AND (created BETWEEN decode(v_created_after, '', to_date('2000-01-01', 'YYYY-MM-DD'), to_date(v_created_after, 'YYYY-MM-DD'))
  AND (decode(v_created_before, '', sysdate, to_date(v_created_before, 'YYYY-MM-DD')) + 0.999999));
return rtn_cursor ;
END SEARCHMYPAGE;

我在Eclipse控制台Message中确认了我的参数,因为我正在使用Eclipse IDE。 我的内容是在2014-10-29~2014-10-31制作的。

当我将'2014-11-01'作为created_after传递时,它返回0条记录。(但我期望所有内容,因为每个内容都在10-29到10-31之间制作)

你会发现我的功能有什么问题吗?

谢谢:D

1 个答案:

答案 0 :(得分:1)

create function search_my_page(p_created_after in date, p_created_before in date)
return cursortype
    is rtn_cursor cursortype; 
begin
    open rtn_cursor for
    select news_id  
    from news
    where created between
        nvl(v_created_after, date '1234-01-01')
        and
        nvl(v_created_before, sysdate) + interval '1' day - interval '1' second;

    return rtn_cursor;
end search_my_page;
/

的变化:

  1. 重写谓词 - 有一个错位的括号改变了含义。
  2. 用日期文字和变量替换to_date。由于您已经使用ANSI日期格式,因此不妨使用文字。并且日期变量不需要转换为日期。
  3. 用更简单的NVL替换DECODE。
  4. 删除了额外的括号。
  5. 将v_重命名为p_。使用p_表示"参数"是典型的。和v为"(本地)变量"。
  6. 删除了额外的内嵌视图。通常内联视图未得到充分利用,在这种情况下,它似乎没什么帮助。
  7. 删除了不必要的1 = 1。
  8. 用日期间隔替换0.99999,使数学更清晰。
  9. 更改为小写(此字母为COBOL),将下划线添加到函数名称。
  10. 将2000-01-01更改为1234-01-01。如果你使用魔法值,它应该看起来不寻常 - 不要试图隐藏它。