比较两个日期 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
我有一个 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