2010-01-11 17 views
2

Je dois créer une vue dans Oracle qui affichera toutes les lignes du dernier jour de la semaine.Afficher dans Oracle pour afficher les lignes du dernier jour de la semaine

Donc, pour mardi, il devrait être comme ça parce que je dois toutes les entrées du lundi:

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

Mais si c'est lundi je besoin de toutes les entrées de vendredi.

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

Comment puis-je créer une vue qui affiche toujours les lignes correctes du dernier jour de la semaine?

Répondre

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 
2

Vous pouvez utiliser 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 

Remarque: En fonction de votre paramètre SNA, to_char(X, 'D') peut retourner 1 pour mondays ou sundays. S'appuyant sur un lundi connu (par exemple: 2000-01-03 dans mon cas) fera fonctionner cette requête dans n'importe quel contexte.