RATES_ALL.EFFECTIVE_DATE 中的日期只是日期,还是也有时间?你可能需要类似的东西:
SELECT RATE, EFFECTIVE_DATE
FROM RATES_ALL
WHERE EFFECTIVE_DATE IN
CASE
WHEN TRIM(TO_CHAR(add_months(&&EFF_DATE, -5), 'DAY')) = 'SATURDAY'
THEN
(
SELECT MAX(EFFECTIVE_DATE)
FROM RATES_ALL
WHERE TRUNC(EFFECTIVE_DATE) = add_months(&&EFF_DATE, -5)-1
)
END;
编辑:
好的,这就是您的代码不起作用的原因:
从文档中,DAY 格式模型是“日期名称,用空格填充以显示用于此元素的日期语言中最宽的日期名称的宽度。” 因此,您的 TO_CHAR 函数引用的输出实际上是 'SATURDAY '(注意末尾的空格)。您必须在 WHEN 子句中修剪 TO_CHAR 函数的输出(有关已编辑的查询,请参见上文)。
您还需要在 SELECT 中使用聚合函数来返回 CASE 语句中的单行,例如 MAX。
重新测试:
WITH rates_all AS
(SELECT TO_DATE('05/31/2012','MM/DD/RRRR') effective_date, 1 rate from dual
UNION
SELECT TO_DATE('12/30/2011','MM/DD/RRRR'), 2 FROM dual
UNION
SELECT TO_DATE('12/30/2011','MM/DD/RRRR'), 3 FROM dual)
SELECT RATE, EFFECTIVE_DATE
FROM RATES_ALL
WHERE EFFECTIVE_DATE IN
CASE
WHEN TRIM(TO_CHAR(add_months(TO_DATE('05/31/2012','MM/DD/RRRR') , -5), 'DAY')) = 'SATURDAY' THEN
(SELECT MAX(EFFECTIVE_DATE)
FROM RATES_ALL
WHERE TRUNC(EFFECTIVE_DATE) =
add_months(TO_DATE '05/31/2012','MM/DD/RRRR') , -5)-1)
END;
RATE EFFECTIVE_DATE
---------- --------------
2 12/30/2011
3 12/30/2011