在 Oracle 中的日期时间比较

标签: oracle11g Oracle
发布时间: 2017/4/15 18:25:40
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

    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 部分。有人能告诉我在哪做错了吗?

解决方法 1:

"CURRENT_DATE 是 VARCHAR2 类型"

我最初的想法 8-泄水孔的井)

不过问题是,在你使用的 CURRENT_DATE 。 假设这 Oracle 功能有两个潜在的问题是︰

  1. CURRENT_DATE 是一个日期数据类型,所以时间元素。 它强制转换为日期也没用。
  2. CURRENT_DATE 返回一个值,为系统时区调整。 大概是你如果测试的点。 但你知道的值是什么?

但它仍然是一个简单的调试任务。 检查你的价值观,明白发生了什么。 这里是一个例子,使用 DBMS_OUTPUT (又名魔鬼的调试器),因为我不知道是否你的工作环境有更好的工具。

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 您需要设置的方法上为您正在使用的任何客户端。


顺便说一下,它是不好的做法,分享 Oracle 内置名称相同的变量声明。 这就是为什么它是一个好的主意来添加一个作用域前缀 ( l_ 的地方, p_ 参数,等) 到我们的声明。 我们没有做充分的匈牙利得到很多益处。

赞助商