比较两个日期 Oracle 的多情况

Multi case when for compare two dates Oracle

我有一个 sql 查询,它使用“case when”来比较两个日期然后赋值,我的代码有效,但我想知道我是否可以将日期计算为 case 句子然后只评估WHEN语句中的值。

代码有效:

SELECT 
     O.ID
     CASE 
       WHEN TO_DATE(SYSDATE) - TO_DATE(O.CREATED_AT) BETWEEN 1  AND 10 THEN 'start'
       WHEN TO_DATE(SYSDATE) - TO_DATE(O.CREATED_AT) BETWEEN 11  AND 15 THEN 'proccesing'
       WHEN TO_DATE(SYSDATE) - TO_DATE(O.CREATED_AT) BETWEEN 16  AND 30 THEN 'finish'
       ELSE 'expired'
     END AS State
FROM ORDER O
WHERE O.STATE > 2

下一个代码抛出下一个错误“SQL 错误 [923] [42000]: ORA-00923: FROM keyword not found where expected”

SELECT 
     O.ID
     CASE TO_DATE(SYSDATE) - TO_DATE(O.CREATED_AT) as totaldays
       WHEN totaldays BETWEEN 1  AND 10 THEN 'start'
       WHEN totaldays BETWEEN 11  AND 15 THEN 'proccesing'
       WHEN totaldays BETWEEN 16  AND 30 THEN 'finish'
       ELSE 'expired'
     END AS State
FROM ORDER O
WHERE O.STATE > 2

我的objective是每行计算一次,这比对每个“案例”句子进行计算要好吗?性能有无差异?

有没有办法先计算一次,再计算结果?

派生的 table 中执行 TO_DATE 内容,您将节省一些输入,并减少容易出错的代码:

SELECT ID,
       CASE WHEN totaldays BETWEEN 1   AND 10 THEN 'start'
            WHEN totaldays BETWEEN 11  AND 15 THEN 'proccesing'
            WHEN totaldays BETWEEN 16  AND 30 THEN 'finish'
            ELSE 'expired'
       END AS State
FROM
(
  SELECT 
       O.ID,
       TRUNC(SYSDATE) - TRUNC(O.CREATED_AT) as totaldays 
  FROM ORDER O
  WHERE O.STATE > 2
) dt

顺便说一句,ORDER 是一个 SQL 保留字,因此 table 名称必须限定为 "ORDER"。 (https://en.wikipedia.org/wiki/SQL_reserved_words.)

编辑: astentx 建议简化为:

SELECT ID,
       CASE WHEN totaldays <= 10 THEN 'start'
            WHEN totaldays <= 15 THEN 'proccesing'
            WHEN totaldays <= 30 THEN 'finish'
            ELSE 'expired'
       END AS State
FROM
(
  SELECT 
       O.ID,
       TRUNC(SYSDATE) - TRUNC(O.CREATED_AT) as totaldays 
  FROM ORDER O
  WHERE O.STATE > 2
) dt