IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Récupérer le dernier jour du mois


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 415
    Points : 40
    Points
    40
    Par défaut Récupérer le dernier jour du mois
    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

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 415
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par McM Voir le message
    Avec TO_CHAR(date, 'D') tu as le jour 1=Dimanche, 2:Lundi, ... 7=Samedi
    .
    merci MCM tu es toujours à la hauteur.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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 
    )
    ;

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 415
    Points : 40
    Points
    40
    Par défaut
    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

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 415
    Points : 40
    Points
    40
    Par défaut
    après tests la solution de McM semble être la plus adaptée
    merci à tous

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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
    Testé dans livesql.oracle, les 2 retournent la même chose

    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

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 415
    Points : 40
    Points
    40
    Par défaut
    merci JeitEmgie c'était une erreur de ma part désolé

    Citation Envoyé par JeitEmgie Voir le message
    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 
    )
    ;

    mais ici comment on élimine seulement le DIMANCHE et pas le lundi, dans la solution de McM on peut manipuler ici >>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND TO_CHAR(d, 'D') NOT IN (1,7)
    avec

    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 .

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    mais ici comment on élimine seulement le DIMANCHE et pas le lundi, dans la solution de McM on peut manipuler ici >>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND TO_CHAR(d, 'D') NOT IN (1,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

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 415
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    qu'est-ce que le lundi vient faire dans le week-end ?

    soit disant j'ai une liste de jours fériés contienne 4 jours, comment générer cette exception avec ton code?

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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").

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer les derniers jours d'un mois
    Par fredonouille dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 14/05/2008, 20h45
  2. [Dates] Premier et dernier jour du mois
    Par Jarodd dans le forum Langage
    Réponses: 6
    Dernier message: 04/08/2006, 10h52
  3. Dernier jour du mois
    Par jane_ng dans le forum Langage
    Réponses: 13
    Dernier message: 03/08/2006, 12h43
  4. Dernier Jours du mois en cours
    Par paradeofphp dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/06/2006, 19h55
  5. premier et dernier jour du mois
    Par oneill701 dans le forum Bases de données
    Réponses: 9
    Dernier message: 21/06/2006, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo