Oracle:程序在日期的SELECT CASE语句中没有正确分支

时间:2009-03-31 23:12:35

标签: oracle

我目前正在开发一个项目,其行为会有所不同,具体取决于是否是公共假期(显然还有其他限制因素)。为此,我正在尝试创建一个包含日期和一周中某一天的表格(将“假日”视为本周的第八天')。

我有一张表我正在寻找假期列表,名为holiday,其中只有一个字段holidaydateDATE数据类型)。我正在尝试将值放入的表名为daydates,包含两个字段dayDATE数据类型)和dayofweekCHAR(10)数据类型)

这是我现在所拥有的逻辑,而我正在测试。

 INSERT INTO holiday
  (holidaydate)
 SELECT sysdate FROM dual;

 SELECT sysdate,
   (
   CASE
     WHEN sysdate IN
       (SELECT h.holidaydate FROM holiday h)
     THEN 'holiday'  
     ELSE TO_CHAR(sysdate , 'day')
   END)
 FROM dual;

不幸的是,它目前正在返回,比如“周三”,而不是“假期”。我有一种感觉,我需要将WHEN sysdate IN更改为WHEN to_char (sysdate, 'dd-mon-yyyy') IN或类似的东西,但我尝试了一些变化,但它们似乎没有效果到目前为止。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

我认为你的问题是它几乎永远不会达到这种情况:

CASE
     WHEN sysdate IN
       (SELECT h.holidaydate FROM holiday h)

因为,当您将 SYSDATE 插入假期表时,会插入日期时间信息。所以你提到的情况几乎从未执行过。

尝试仅比较案例中日期的重要部分。

CASE
   WHEN TRUNC(SYSDATE) IN (SELECT TRUNC(h.holidaydate) from holiday h)

它应该有用。

答案 1 :(得分:2)

在您的假期表中,您只对日期而不是时间组件感兴趣。施加约束来强制执行此操作并阻止任何人犯同样的错误:

CREATE TABLE HOLIDAY
(holidaydate  DATE NOT NULL 
              CONSTRAINT DateOnlyNoTime 
                 CHECK (holidayDate = TRUNC(holidayDate)));

毫无疑问,您需要主键和其他一些列。

删除日期的日期/时间部分的首选方法是出于性能原因使用上述TRUNC()而不是TO_DATE()。您的示例查询将变为:

SELECT sysdate,
  (
  CASE
    WHEN TRUNC(sysdate) IN
      (SELECT h.holidaydate FROM holiday h)
    THEN 'holiday'
    ELSE TO_CHAR(sysdate , 'day')
  END)
FROM dual;

答案 2 :(得分:0)

你要求提出建议......

  • 您是否已通过第一个声明检查了假期表中插入的内容,以确保其正确无误?
  • 您是否尝试从图片中取出sysdate(例如使用常量)来查看是否是导致问题的原因?
  • 您是否尝试使用常量列表替换内部选择?