我试图让它显示,但它是抓取我空当输出应该是'YES'
SELECT STRT_DT,END_DT,SYSDATE AS DT,
CASE
WHEN TO_CHAR(STRT_DT,'MON-YYYY') <= TO_CHAR(SYSDATE,'MON-YYYY')
AND TO_CHAR(END_DT,'MON-YYYY') = TO_CHAR(SYSDATE,'MON-YYYY') THEN 'Yes'
END AS D
FROM
(
SELECT TO_DATE('14-JAN-2022','DD-MON-YYYY') AS STRT_DT
, TO_DATE('05-APR-2022','DD-MON-YYYY') AS END_DT
FROM DUAL);
由于这一行,它不能工作:
TO_CHAR(STRT_DT,'MON-YYYY') <= TO_CHAR(SYSDATE,'MON-YYYY')
你在字符串上使用"比较运算符",如果它是日期数据类型,引擎会知道这两者之间的"更高"日期是什么,但因为它是一个字符串,这个条件不会像你想的那样工作(它是按字母顺序比较那些字符串),简单的解决方案是将其替换为:
STRT_DT <= SYSDATE
或者如果你只想比较月份和年份:
TRUNC(STRT_DT,'MM') <= TRUNC(sysdate,'MM')
这里我们截断了月份,因此只有月份和年份与比较相关,换句话说,如果STRT_DT
和SYSDATE
在相同的年份和月份,即使STRT_DT
比SYSDATE
"高"(从该月的未来一天开始),条件也将得到满足。
不能工作;您正在比较月份名称。切换到不同的格式模型,允许有意义的比较,例如YYYYMM
代替MON-YYYY
:
SQL> SELECT STRT_DT,
2 END_DT,
3 SYSDATE AS DT,
4 CASE
5 WHEN TO_CHAR (STRT_DT, 'yyyymm') <= TO_CHAR (SYSDATE, 'yyyymm')
6 AND TO_CHAR (END_DT, 'yyyymm') = TO_CHAR (SYSDATE, 'yyyymm')
7 THEN
8 'Yes'
9 ELSE
10 'No'
11 END AS D
12 FROM (SELECT TO_DATE ('14-JAN-2022', 'DD-MON-YYYY') AS STRT_DT,
13 TO_DATE ('05-APR-2022', 'DD-MON-YYYY') AS END_DT
14 FROM DUAL);
STRT_DT END_DT DT D
---------- ---------- ---------- ---
14.01.2022 05.04.2022 22.04.2022 Yes
SQL>