我正在尝试让它显示,但是当输出应该是"是"时,它为空

  • 本文关键字:输出 显示 sql oracle date oracle11g
  • 更新时间 :
  • 英文 :


我试图让它显示,但它是抓取我空当输出应该是'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_DTSYSDATE在相同的年份和月份,即使STRT_DTSYSDATE"高"(从该月的未来一天开始),条件也将得到满足。

不能工作;您正在比较月份名称。切换到不同的格式模型,允许有意义的比较,例如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>

相关内容

  • 没有找到相关文章

最新更新