Bonjour à tous,
j'ai besoin de récupérer la date du dernier jour du mois de toute l'année en éliminant les week-ends
merci par avance
Bonjour à tous,
j'ai besoin de récupérer la date du dernier jour du mois de toute l'année en éliminant les week-ends
merci par avance
Avec TO_CHAR(date, 'D') tu as le jour 1=Dimanche, 2:Lundi, ... 7=Samedi
Il suffit que tu testes si le dernier jour du mois est un dimanche tu enlèves 2 jours, si c'est un samedi tu enlèves 1 jour.
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
Sinon, petit amusement pour avoir tous les derniers jours ouvrés des mois de l'année 2019
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT MAX(d), TO_CHAR(MAX(d), 'FMDAY', 'NLS_DATE_LANGUAGE=french') jour FROM (SELECT TRUNC(SYSDATE, 'RRRR') - 1 + LEVEL d FROM dual connect BY LEVEL < 367) WHERE EXTRACT(YEAR FROM d) = 2019 AND TO_CHAR(d, 'D') NOT IN (1,7) GROUP BY TRUNC(d, 'MM') ORDER BY 1
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
Dommage de faire un "connect by" sur 366 valeurs pour en retourner 12...
Autre solution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 with dates as ( select add_months(trunc(to_date('2019','YYYY'),'YYYY'),level) - 1 as d from dual connect by level < 13 ) select d as "date", TO_CHAR(d, 'FMDAY', 'NLS_DATE_LANGUAGE=french') as "jour" from ( select d + least(0, 5 - (1 + TRUNC (d) - TRUNC (d, 'IW')) ) as d from dates ) ;
Hélas, les deux requêtes de JeitEmgie et McM ne retournent pas les même valeurs !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ___MAX(D)______JOUR___ __ ____date_____________jour 31/01/2019____JEUDI____________31/01/2019____JEUDI 28/02/2019____JEUDI____________28/02/2019____JEUDI 30/03/2019____SAMEDI___________29/03/2019____VENDREDI 30/04/2019____MARDI____________30/04/2019____MARDI 31/05/2019____VENDREDI_________31/05/2019____VENDREDI 29/06/2019____SAMEDI___________28/06/2019____VENDREDI 31/07/2019____MERCREDI_________31/07/2019____MERCREDI 31/08/2019____SAMEDI___________30/08/2019____VENDREDI 28/09/2019____SAMEDI___________30/09/2019____LUNDI 31/10/2019____JEUDI____________31/10/2019____JEUDI 30/11/2019____SAMEDI___________29/11/2019____VENDREDI 31/12/2019____MARDI____________31/12/2019____MARDI
après tests la solution de McM semble être la plus adaptée
merci à tous
Testé dans livesql.oracle, les 2 retournent la même chose
MAX(D) JOUR 31-JAN-19 JEUDI 28-FEB-19 JEUDI 29-MAR-19 VENDREDI 30-APR-19 MARDI 31-MAY-19 VENDREDI 28-JUN-19 VENDREDI 31-JUL-19 MERCREDI 30-AUG-19 VENDREDI 30-SEP-19 LUNDI 31-OCT-19 JEUDI 29-NOV-19 VENDREDI 31-DEC-19 MARDI
date jour 31-JAN-19 JEUDI 28-FEB-19 JEUDI 29-MAR-19 VENDREDI 30-APR-19 MARDI 31-MAY-19 VENDREDI 28-JUN-19 VENDREDI 31-JUL-19 MERCREDI 30-AUG-19 VENDREDI 30-SEP-19 LUNDI 31-OCT-19 JEUDI 29-NOV-19 VENDREDI 31-DEC-19 MARDI
merci JeitEmgie c'était une erreur de ma part désolé
mais ici comment on élimine seulement le DIMANCHE et pas le lundi, dans la solution de McM on peut manipuler ici >>avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part AND TO_CHAR(d, 'D') NOT IN (1,7)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 -- LUNDI 1 . -- MARDI 2 . -- MERCREDI 3 . -- JEUDI 4 . -- VENDREDI 5 . -- SAMEDI 6 . -- DIMANCHE 7 .
qu'est-ce que le lundi vient faire dans le week-end ?
si vous voulez que seul le dimanche soit enlevé et pas le samedi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 with dates as ( select add_months(trunc(to_date('2019','YYYY'),'YYYY'),level) - 1 as d from dual connect by level < 13 ) select d as "date", TO_CHAR(d, 'FMDAY', 'NLS_DATE_LANGUAGE=french') as "jourN", TO_CHAR(d1, 'FMDAY', 'NLS_DATE_LANGUAGE=french') as "jourNS" from ( select d + least(0, 5 - (1 + TRUNC (d) - TRUNC (d, 'IW')) ) as d, d + least(0, 6 - (1 + TRUNC (d) - TRUNC (d, 'IW')) ) as d1 from dates ) ;
Result Set 6
date jourN jourNS 31-JAN-19 JEUDI JEUDI 28-FEB-19 JEUDI JEUDI 29-MAR-19 VENDREDI SAMEDI 30-APR-19 MARDI MARDI 31-MAY-19 VENDREDI VENDREDI 28-JUN-19 VENDREDI SAMEDI 31-JUL-19 MERCREDI MERCREDI 30-AUG-19 VENDREDI SAMEDI 30-SEP-19 LUNDI LUNDI 31-OCT-19 JEUDI JEUDI 29-NOV-19 VENDREDI SAMEDI 31-DEC-19 MARDI MARDI
Avant d'appliquer le shift de jour, vous devez sélectionner la max(date) <= à celle du dernier jour calculé du mois qui n'est pas dans la liste des jours fériés...
Vous pourrez vous retrouver avec un dernier jour du mois qui est le même que celui du mois précédent si l'entreprise ferme un mois par exemple... (e.g. "congés du bâtiment").
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager