2

先週のすべての行を表示するビューをOracleで作成する必要があります。

したがって、火曜日の場合は次のようになります。月曜日からのすべてのエントリが必要です。

select * from table_1 where to_char(Mydate,'yyyy-mm-dd') =  to_char(sysdate-**1**,'yyyy-mm-dd');

しかし、月曜日の場合は、金曜日からのすべてのエントリが必要です。

select * from table_1 where to_char(Mydate,'yyyy-mm-dd') =  to_char(sysdate-**3**,'yyyy-mm-dd');       

先週の平日から常に正しい行を表示する1つのビューを作成するにはどうすればよいですか?

4

2 に答える 2

2
SELECT  *
FROM    table_1
WHERE   mydate >= SYSDATE - CASE WHEN TO_CHAR(SYSDATE, 'D') > 6 THEN 3 ELSE 1 END
        AND mydate < SYSDATE - CASE WHEN TO_CHAR(SYSDATE, 'D') > 6 THEN 3 ELSE 1 END + 1
于 2010-01-11T16:29:32.987 に答える
2

CASEを使用できます:

SQL> WITH table_1 AS
  2  (SELECT SYSDATE - 20 + ROWNUM mydate FROM dual CONNECT BY ROWNUM <= 40)
  3  SELECT *
  4    FROM table_1
  5   WHERE trunc(Mydate) =
  6           CASE WHEN to_char(SYSDATE, 'D') = to_char(DATE '2000-01-02', 'D')
  7              THEN -- sunday
  8              trunc(SYSDATE - 2)
  9           WHEN to_char(SYSDATE, 'D') = to_char(DATE '2000-01-03', 'D')
 10              THEN -- monday
 11              trunc(SYSDATE - 3)
 12           ELSE
 13              trunc(SYSDATE - 1)
 14           END;

MYDATE
-----------
08/01/2010

:NLS設定によっては、to_char(X, 'D')月曜日または日曜日に1が返される場合があります。既知の月曜日(私の場合は2000-01-03など)に依存すると、このクエリはどの設定でも機能します。

于 2010-01-11T16:31:41.827 に答える