0

我正在我的存储过程中的几个日期之间进行比较。

    TODAY := TO_DATE(TO_CHAR(SYSDATE, 'DD-MON-YYYY') || 
             ' 09:00:00', 'DD-MON-YYYY HH24:MI:SS');

    IF PREVIOUS_DATE < TODAY AND 
       TO_DATE(CURRENT_DATE, 'DD-MON-YYYY HH24:MI:SS') >= TODAY THEN
        -- do something
    ELSE
        -- do something else

当我设置CURRENT_DATE = SYSDATE时,它没有进入该IF部分。有人可以告诉我我在哪里做错了吗?

4

1 回答 1

3

“CURRENT_DATE 是 VARCHAR2 类型”

好吧,这破坏了我的第一个想法 8-)

但我认为问题在于您使用CURRENT_DATE. 假设是 Oracle 函数存在两个潜在问题:

  1. CURRENT_DATE 是 DATE 数据类型,因此具有时间元素。把它定型是没有意义的。
  2. CURRENT_DATE 返回为系统时区调整的值。这大概是您的 IF 测试的重点。但是你知道价值观是什么吗?

但它仍然是一个简单的调试任务。检查您的价值观以了解正在发生的事情。这是一个使用 DBMS_OUTPUT(又名 The Devil's Debugger)的示例,因为我不知道您是否在使用更好工具的环境中工作。

TODAY := trunc(sysdate) + 9/24;

dbms_output.put_line('TODAY = '||to_char(today, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('PREVIOUS_DATE = '||to_char(previous_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('CURRENT_DATE = '||current_date);


IF PREVIOUS_DATE < TODAY AND 
   to_date(CURRENT_DATE, 'DD-MON-YYYY HH24:MI:SS') >= TODAY
THEN 
    .... 

不妨同时简化您的代码。

请记住,要查看 DBMS_OUTPUT.PUT_LINE 的输出,您需要为您使用的任何客户端设置 SERVEROUTPUT ON。


顺便说一句,声明与 Oracle 内置函数同名的变量是不好的做法。这就是为什么在我们的声明中添加一个作用域前缀(l_对于本地、p_对于参数等)是个好主意。我们不必做完整的匈牙利语来获得很多好处。

于 2013-04-24T08:04:42.763 回答