1

我想退回RATE5 个月前的那个EFFECTIVE_DATE。如果该日期是星期六,那么我想将日期EFF_DATE向后移动 1 天,以便EFFECTIVE_DATE在星期五。这是我正在使用的代码,但到目前为止它没有返回任何值:

DEFINE EFF_DATE = TO_DATE('05/31/2012','MM/DD/RRRR')
SELECT RATE, EFFECTIVE_DATE
FROM RATES_ALL
WHERE EFFECTIVE_DATE IN
  CASE 
    WHEN TO_CHAR(add_months(&&EFF_DATE, -5), 'DAY') = 'SATURDAY'
    THEN 
      (
        SELECT EFFECTIVE_DATE 
        FROM RATES_ALL 
        WHERE EFFECTIVE_DATE = add_months(&&EFF_DATE, -5)-1
      )
    END;
4

4 回答 4

0

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
于 2012-07-06T16:15:54.677 回答
0

我认为有一个内部查询会更容易,它返回 5 个月前和 5 个月前和一天前的记录,然后在外部查询中,您从内部查询中选择当天的最大结果星期六。

于 2012-07-06T16:24:17.560 回答
0

如果您的子查询中包含 equals,则只有在 RATES_ALL 中有一个 ROW 且日期正好是 5 个月之前,您才会得到匹配。

你确定你的表总是有一个日期在 5 个月前的行吗?例如(不确定这是否是您想要的,但这将返回至少 5 个月前的最新/最新行):

    SELECT MAX(EFFECTIVE_DATE) 
    FROM RATES_ALL 
    WHERE EFFECTIVE_DATE <= add_months(&&EFF_DATE, -5)-1
于 2012-07-06T16:47:04.123 回答
0

我不了解 Oracle,但假设您检查周六的原因是因为 RATES_ALL 表中没有周六的条目,那么为什么不简单地像这样:

SELECT RA1.RATE, RA1.EFFECTIVE_DATE
FROM RATES_ALL RA1
WHERE RA1.EFFECTIVE_DATE = add_months(&&EFF_DATE, -5)
   OR (RA1.EFFECTIVE_DATE = add_months(&&EFF_DATE, -5)-1
   AND NOT EXISTS(SELECT * FROM RATES_ALL RA2
                  WHERE RA2.EFFECTIVE_DATE = add_months(&&EFF_DATE, -5))
于 2012-07-06T17:17:00.930 回答