oracle 两个月之间的情况- ORA-00905:缺失关键字

tyu7yeag  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(287)

我已经从不同的子查询中捎带了这个查询(它可以工作),但是我在WHERE中添加了一个CASE子句。它给了我一个“缺少关键字”的错误,我看不出问题可能是什么。不幸的是,我周围没有人可以帮助我寻找我猜是一个非常小的错误,我没有看到。
CASE基本上应该说:

WHEN MONTH BETWEEN JAN AND JUN THEN START_DATE > 30/06/[CURRENT YEAR]
ELSE START_DATE > 30/06/[CURRENT YEAR] + 1
SELECT fp.object_id inv_id
      ,nvl(round(SUM((oc.finish_date - oc.start_date) * oc.slice)),0) forecast_amt
FROM odf_ssl_cst_dtl_cost oc
left join fin_cost_plan_details fd on fd.id  = oc.prj_object_id
left join fin_plans fp on fp.id = fd.plan_id
    and fp.plan_type_code = 'FORECAST'
    and fp.is_plan_of_record = 1 
WHERE CASE
    WHEN MONTH(GETDATE()) BETWEEN 1 AND 6 
        THEN oc.start_date > DATEADD(MONTH,6,DATEADD(DD,-1,DATEADD(YYYY, DATEDIFF(YYYY,0,GETDATE()),0)))
    ELSE oc.start_date > DATEADD(MONTH,6,DATEADD(DD,-1,DATEADD(YYYY, DATEDIFF(YYYY,0,GETDATE())+1,0)))
END
GROUP BY fp.object_id
gxwragnw

gxwragnw1#

CASE返回一个值,但不能用它来返回WHERE条件的布尔值。
重写WHERE子句,将比较 * 移到CASE外部 *,让CASE只返回要比较的值:

WHERE oc.start_date >
    CASE
         WHEN MONTH(GETDATE()) BETWEEN 1 AND 6 
            THEN DATEADD(MONTH,6,DATEADD(DD,-1,DATEADD(YYYY, DATEDIFF(YYYY,0,GETDATE()),0)))
        ELSE DATEADD(MONTH,6,DATEADD(DD,-1,DATEADD(YYYY, DATEDIFF(YYYY,0,GETDATE())+1,0)))
    END
zzlelutf

zzlelutf2#

Oracle不支持GETDATEDATEDIFFDATEADD函数,您可能希望使用SYSDATEMONTHS_BETWEENADD_MONTHS
CASE表达式返回标量值;它不能返回表达式。
您的逻辑可以简化为在当前日期上添加6个月,然后TRUNC将该日期添加到年初,再添加6个月,并将该值与start_date进行比较(这消除了任何分支逻辑的需要):

SELECT fp.object_id inv_id,
       COALESCE(round(SUM((oc.finish_date - oc.start_date) * oc.slice)),0)
         AS forecast_amt
FROM   odf_ssl_cst_dtl_cost oc
       LEFT JOIN fin_cost_plan_details fd
       ON     fd.id  = oc.prj_object_id
       LEFT JOIN fin_plans fp
       ON     fp.id = fd.plan_id
          AND fp.plan_type_code = 'FORECAST'
          AND fp.is_plan_of_record = 1 
WHERE  oc.start_date > ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE, 6), 'YY'), 6)
GROUP BY fp.object_id

如果您未使用Oracle或已为GETDATEDATEADD实现用户定义函数,则:

WHERE  oc.start_date > DATEADD(MONTH, 6, TRUNC(DATEADD(MONTH, 6, GETDATE()), 'YY'), 6)

相关问题