在Oracle中查看以显示上一个工作日的行

时间:2010-01-11 16:20:02

标签: oracle weekday

我需要在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');       

如何创建一个始终显示上一个工作日正确行的视图?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)将使此查询在任何设置中都有效。