我已经从不同的子查询中捎带了这个查询(它可以工作),但是我在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
2条答案
按热度按时间gxwragnw1#
CASE
返回一个值,但不能用它来返回WHERE
条件的布尔值。重写
WHERE
子句,将比较 * 移到CASE
外部 *,让CASE
只返回要比较的值:zzlelutf2#
Oracle不支持
GETDATE
、DATEDIFF
或DATEADD
函数,您可能希望使用SYSDATE
、MONTHS_BETWEEN
和ADD_MONTHS
。CASE
表达式返回标量值;它不能返回表达式。您的逻辑可以简化为在当前日期上添加6个月,然后
TRUNC
将该日期添加到年初,再添加6个月,并将该值与start_date
进行比较(这消除了任何分支逻辑的需要):如果您未使用Oracle或已为
GETDATE
和DATEADD
实现用户定义函数,则: