ORACLE CASE和DATES

ifmq2ha2  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(119)

我在这个查询中遇到了问题

SELECT ID, MYDATE
  FROM MY_DATABASE
 WHERE (CASE
           WHEN TO_CHAR (SYSDATE, 'D') IN ('3',
                                           '4',
                                           '5',
                                           '6',
                                           '7')
           THEN
                  MYDATE > (SYSDATE - NUMTODSINTERVAL ('1', 'DAY'))
              AND TO_CHAR (MYDATE, 'YYYY-MM-DD') !=
                     TO_CHAR (MYDATE, 'YYYY-MM-DD'))
    WHEN TO_CHAR(SYSDATE,'D') IN ('2') THEN MYDATE > (SYSDATE -NUMTODSINTERVAL('2','DAY')) AND TO_CHAR(MYDATE, 'YYYY-MM-DD') != TO_CHAR (MYDATE, 'YYYY-MM-DD'))
    ELSE NULL
    END)=1

Oracle表示在“MYDATE(HERE)>(SYSDATE)”之间缺少一个特定的单词
我还尝试在'THEN'之后创建子查询
我要看身份证。如果今天是“星期一”。星期一的数字是“2”。
给我看前两天的id不算今天的id
如果星期二到星期六的数字是3到7,请告诉我过去1天的id,不包括今天的id

cld4siwp

cld4siwp1#

语法无效。也许你的意思是这样的?

select id, mydate
from my_database
where mydate > sysdate - case when to_char(sysdate, 'D') in (3, 4, 5, 6, 7) then 1
                              when to_char(sysdate, 'D') in (2)             then 2
                         end;

我不知道你说的状况是什么意思

AND TO_CHAR(MYDATE, 'YYYY-MM-DD') != TO_CHAR (MYDATE, 'YYYY-MM-DD'))

因为它从来都不是真的;你比较相同的值,它们永远不会 * 不同 *。

**[编辑]**您评论说您想 * 跳过 * 今天的行。

在这种情况下,一个简单的选择是使用

and trunc(mydate) <> trunc(sysdate)

但是请注意,mydate列上的索引(如果有的话)不会被使用,除非您创建了一个基于函数的索引。在这种情况下,使用稍微复杂一点的选项。
举例来说:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';

Session altered.

现在是

SQL> select sysdate from dual;

SYSDATE
----------------
12.09.2023 21:54

跳过今天的mydate的条件:

SQL> with test (mydate) as
  2    (select to_date('02.09.2023 14:23', 'dd.mm.yyyy hh24:mi') from dual union all
  3     select to_date('12-09.2023 08:30', 'dd.mm.yyyy hh24:mi') from dual union all
  4     select to_date('20.09.2023 18:55', 'dd.mm.yyyy hh24:mi') from dual
  5    )
  6  select mydate
  7  from test
  8  where mydate < trunc(sysdate)
  9     or mydate >= trunc(sysdate + 1);

MYDATE
----------------
02.09.2023 14:23
20.09.2023 18:55

SQL>
z3yyvxxp

z3yyvxxp2#

如果今天是“星期一”[.]显示过去两天的id,不计算今天的id。
如果星期二到星期六[.]显示过去1天的id,不计算今天的id
TO_CHAR(date_value, 'D')在世界各地的不同地区(即在美国,星期日是一周的第一天;在欧洲,星期一是一周的第一天;在中东,星期六是一周的第一天;而在孟加拉国,星期五是一周的第一天)。这使得在国际上使用TO_CHAR(date_value, 'D')变得困难。相反,您可以使用TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW')将这一天与ISO周的开始(始终是星期一午夜)进行比较。
你的代码应该是:

SELECT ID,
       MYDATE
FROM   MY_DATABASE
WHERE  MYDATE <  TRUNC(SYSDATE) -- without today
AND    MYDATE >= TRUNC(SYSDATE) - CASE TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW')
                                  WHEN 0                -- Monday
                                  THEN INTERVAL '2' DAY
                                  WHEN 6                -- Sunday
                                  THEN INTERVAL '0' DAY
                                  ELSE INTERVAL '1' DAY -- Tuesday to Saturday
                                  END;

相关问题