1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 7
    Points : 5
    Points
    5

    Par défaut SQL- Reconstituer une date à partir d'un numéro de semaine

    Bonjour a tous,

    Via une requête sql j'ai besoin de reconstituer une date avec les éléments à ma disposition
    Année
    Mois
    Semaine

    Pourriez vous m'aider svp ?
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de vttman
    Homme Profil pro
    Quinqua ... Poli, ve/aillant de l'Informatique
    Inscrit en
    décembre 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Quinqua ... Poli, ve/aillant de l'Informatique

    Informations forums :
    Inscription : décembre 2002
    Messages : 540
    Points : 1 002
    Points
    1 002

    Par défaut

    En fouillant un peu sur le net ce matin avec ces mots clef => "db2 find date with week",
    bon je n'ai pas DB2 sous le coude pour tester...
    Restera à inclure le mois ...

    I need to find the last date of week when i pass year and week number as input in my stored procedure
    ...
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NEXT_DAY(DATE(CAST((<year>*1000 + (<week>-1)*7+1) AS CHAR(7)) -1, 'FRI')
    Mais ça fait une réponse
    Je suis sympa comme tout Mosellan mais ...
    ... (m')aider ou (me) mettre sur la voie c'est une chose
    ... tout (me) faire de A à Z, c'est pas ma conception du rôle d'un forum X ou Y
    Si vous n'êtes pas satisfait de mes réponses, n'hésitez pas à me le faire savoir Merci !

  3. #3
    Expert confirmé
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 516
    Points : 5 626
    Points
    5 626

    Par défaut

    Bonjour,

    En reprenant la proposition de VttMan mise à l'épreuve des faits sur DB2 for Z/OS, voici une petite correction, pour tenir compte des problématiques spécifiques des semaines 1 et 53
    Attention toutefois, comme vous n'avez pas précisé de quel DB2 il s'agit, il peut éventuellement y avoir des adaptations à faire

    Une première CTE pour créer un jeu d'essai avec des années bissextiles et non bissextiles, et ayant ou non une semaine 53

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    WITH CTE1 (ANNEE, SEMAINE) AS (                  
         SELECT '2015', '01' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2015', '04' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2015', '52' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2015', '53' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2016', '01' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2016', '52' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2016', '53' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2017', '01' FROM SYSIBM.SYSDUMMY1   
         UNION ALL                                   
         SELECT '2017', '12' FROM SYSIBM.SYSDUMMY1   
         UNION ALL            
         SELECT '2017', '52' FROM SYSIBM.SYSDUMMY1       
         UNION ALL                                       
         SELECT '2017', '53' FROM SYSIBM.SYSDUMMY1       
        )
    Une deuxième CTE qui calcule un quantième quelconque dans la semaine, le +4 permet de rester dans la bonne semaine pour le cas particulier de la semaine 1 qui comprend 4 à 10 jours selon les années.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    , CTE2 (AAAA, WW, AAAAQQQ, MADATE) AS (                  
    SELECT ANNEE                                             
         , SEMAINE                                           
         , ANNEE                                             
         !!DIGITS(CAST((SEMAINE-1)*7 +4 AS DECIMAL(3,0)))    
         , CASE WHEN SEMAINE < '53' THEN                     
           TO_DATE(ANNEE!!DIGITS(CAST((SEMAINE-1)*7 +4       
                   AS DECIMAL(3,0))),'YYYYDDD',6)            
                ELSE TO_DATE(ANNEE!!'365','YYYYDDD',6)       
           END                                               
    FROM CTE1)
    Et une troisième, si besoin, pour trouver le lundi qui précède la date calculée, attention, dans le cas de la semaine 1, on peut revenir au dernier lundi de l'année qui précède, à adapter le cas échéant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       SELECT AAAA                                                 
            , WW                                                   
            , MADATE                                               
            , CASE WHEN DAYOFWEEK_ISO(MADATE) > 1                  
              THEN DATE(MADATE)- (DAYOFWEEK_ISO(MADATE)-1) DAYS    
              ELSE DATE(MADATE)                                    
              END                                                  
       FROM CTE2
    Ce qui donne pour le jeu d'essai de la requête 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    2015 01 2015-01-04-00.00.00.000000 2014-12-29 
    2015 04 2015-01-25-00.00.00.000000 2015-01-19 
    2015 52 2015-12-27-00.00.00.000000 2015-12-21 
    2015 53 2015-12-31-00.00.00.000000 2015-12-28 
    2016 01 2016-01-04-00.00.00.000000 2016-01-04 
    2016 52 2016-12-26-00.00.00.000000 2016-12-26 
    2016 53 2016-12-30-00.00.00.000000 2016-12-26 
    2017 01 2017-01-04-00.00.00.000000 2017-01-02 
    2017 12 2017-03-22-00.00.00.000000 2017-03-20 
    2017 52 2017-12-27-00.00.00.000000 2017-12-25 
    2017 53 2017-12-31-00.00.00.000000 2017-12-25

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 7
    Points : 5
    Points
    5

    Par défaut

    Merci pour vos réponses
    N'ayant malheureusement pas un super niveau de SQL pouvez vous m'aider à rapporter cette requête avec mes éléments

    Table = Ma table
    Société = société
    Article = article
    Quantité = Qté
    Champ mois = CNAN
    Champs semaine = CNSE

    Je souhaite sélectionner les éléments suivants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select société, article, Qte, CNAN, CNSE
    from ma table
    Where société = 1
    En ajoutant un critère de bornage de date par exemple les 10 dernieres semaine par rapport à la semaine -1 ou alors les 70 derniers jours (d'ou ma question initiale)

    Merci d'avance vous seriez des chefs

  5. #5
    Expert confirmé
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 516
    Points : 5 626
    Points
    5 626

    Par défaut

    Bonjour,

    Pour filtrer sur les 70 derniers jours il suffit d'ajouter ceci dans la dernière requête que je vous ai communiquée

    WHERE DAYS(CURRENT_TIMESTAMP) - DAYS(MADATE) < 71
    Pour ce qui concerne l'adaptation avec vos noms de colonnes, vous devriez y arriver tout seul, rien d'insurmontable

    Si vous avez besoin de cours SQL, vous avez tout le nécessaire ici :
    https://www.developpez.net/forums/d6...q-langage-sql/

  6. #6
    Membre éprouvé Avatar de vttman
    Homme Profil pro
    Quinqua ... Poli, ve/aillant de l'Informatique
    Inscrit en
    décembre 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Quinqua ... Poli, ve/aillant de l'Informatique

    Informations forums :
    Inscription : décembre 2002
    Messages : 540
    Points : 1 002
    Points
    1 002

    Par défaut

    Citation Envoyé par escartefigue Voir le message
    ...
    Pour ce qui concerne l'adaptation avec vos noms de colonnes, vous devriez y arriver tout seul, rien d'insurmontable
    ...
    +1 avec Escartefigue, rien d'insurmontable, en plus on corrigera si la requête en question donne des erreurs
    Je suis sympa comme tout Mosellan mais ...
    ... (m')aider ou (me) mettre sur la voie c'est une chose
    ... tout (me) faire de A à Z, c'est pas ma conception du rôle d'un forum X ou Y
    Si vous n'êtes pas satisfait de mes réponses, n'hésitez pas à me le faire savoir Merci !

Discussions similaires

  1. [2008R2] Récupérer une date à partir d'un numéro de semaine et d'une année.
    Par ff.martin dans le forum Développement
    Réponses: 5
    Dernier message: 24/07/2014, 15h20
  2. Réponses: 9
    Dernier message: 21/07/2010, 08h43
  3. Récupérer la date à partir d'un numéro de semaine et de l'année
    Par aurelientp dans le forum Général Java
    Réponses: 4
    Dernier message: 11/01/2010, 13h43
  4. [VB.Net] Obtenir une date à partir d'un numero de semaine
    Par tonysky dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/01/2007, 08h57
  5. Réponses: 6
    Dernier message: 25/09/2006, 14h51

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