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

Développement SQL Server Discussion :

Année 2021, semaine 1 et suivantes, pas les bonnes dates [2016]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Par défaut Année 2021, semaine 1 et suivantes, pas les bonnes dates
    Bonjour,

    Je rencontre un petit souci avec des dates avec des numéros de semaine. Voici mon code initial :
    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
    declare @semaine int
    declare @annee int
     
    SET @semaine = 1
    set @annee = 2020
     
    IF @Semaine = 53 
    (select * from menu where datepart(wk,date_repas) = @semaine and year(date_repas) = @annee and heure = 1 
    union
    select * from menu where datepart(wk,date_repas) = 1 and year(date_repas) = @annee + 1 and heure = 1)
    else if @Semaine = 1
    (
    select * from menu where datepart(wk,date_repas) = @semaine and year(date_repas) = @annee and heure = 1 
    union
    select * from menu where datepart(wk,date_repas) = 53 and year(date_repas) = @annee - 1 and heure = 1
    )
    else
    select * from menu where datepart(wk,date_repas) = @semaine and year(date_repas) = @annee and heure = 1
    Voici les résultats :

    Nom : ex1.PNG
Affichages : 809
Taille : 10,6 Ko

    Pour le passage d'une année de 52 semaines à la suivante, pas de souci. Par contre, pour l'année qui compte 53 semaines, j'ai un souci, puisque que mes semaines 53 et 1 sont les mêmes. Et on voit ensuite que toute l'année est décalée, la semaine 2 commençant normalement le 11/01/2020. J'ai donc cherché et trouvé le "iso_week" au lieu du "wk".

    Le nouveau code :
    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
    declare @semaine int
    declare @annee int
     
    SET @semaine = 1
    set @annee = 2020
     
    IF @Semaine = 53 
    (select * from menu where datepart(wk,date_repas) = @semaine and year(date_repas) = @annee and heure = 1 
    union
    select * from menu where datepart(wk,date_repas) = 1 and year(date_repas) = @annee + 1 and heure = 1)
    else if @Semaine = 1
    (
    select * from menu where datepart(wk,date_repas) = @semaine and year(date_repas) = @annee and heure = 1 
    union
    select * from menu where datepart(wk,date_repas) = 53 and year(date_repas) = @annee - 1 and heure = 1
    )
    else
    select * from menu where datepart(iso_week,date_repas) = @semaine and year(date_repas) = @annee and heure = 1
    Et le résultat :
    Nom : ex2.PNG
Affichages : 763
Taille : 10,3 Ko

    Cette fois-ci, ma semaine 2 est correcte.
    Par contre, ma semaine 1 n'est toujours pas correcte. Pour qu'elle soit correcte, il suffit de lui appliquer le dernier select, avec l'iso_week. Et donc du coup, d'enlever le if. Sauf que ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare @semaine int
    declare @annee int
     
    SET @semaine = 52
    set @annee = 2019
     
    IF @Semaine = 53 
    (select * from menu where datepart(wk,date_repas) = @semaine and year(date_repas) = @annee and heure = 1 
    union
    select * from menu where datepart(wk,date_repas) = 1 and year(date_repas) = @annee + 1 and heure = 1)
    else
    select * from menu where datepart(iso_week,date_repas) = @semaine and year(date_repas) = @annee and heure = 1
    Me donne :
    Nom : ex3.PNG
Affichages : 760
Taille : 10,7 Ko
    Avec ma semaine 1 en 2020 qui n'est pas correct.

    J'ai donc remis le "if @Semaine = 1" et j'ai testé toutes les combinaisons possibles de wk/iso_week, mais rien à faire, je n'arrive pas à obtenir une semaine 1 correcte en 2021 de cette manière, il faut que je passe par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from menu where datepart(iso_week,date_repas) = @semaine and year(date_repas) = @annee and heure = 1
    pour que cette semaine soit complète.

    Du coup, vous l'aurez compris, je suis perdu. Ce que je souhaite, c'est simplement, à partir d'un couple semaine/année récupérer les dates de la semaine dans ma table.
    Est-ce qu'il y a un moyen de faire cela ?

    Je vous remercie par avance pour l'attention que vous voudrez bien accorder à ma problématique.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    il serait préférable de calculer la borne inférieure (donc le lundi de la semaine souhaitée ici) et de faire la requete sur cette date calculée. (le fait d'appliquer des fonctions/conversions au colonne dans le filtre peut empêcher l'utilisation d'index)

    Par exemple :

    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
     
     
    declare @semaine int = 2
    declare @annee int  = 2021
     
    DECLARE @Debut DATE
     
    SET @Debut = CAST(CONCAT(@annee, '0104') AS DATE) --le 4 janvier est forcément en semaine 1
    SET @Debut = DATEADD(WEEK, @semaine - 1, CAST(CONCAT(@annee, '0104') AS DATE)) -- on rajoute le nombre de semaines voulues
    SET @Debut = DATEADD(WEEK, DATEDIFF(WEEK, '20191223', @Debut), '20191223') -- on cherche le lundi de cette semaine
     
    select * 
    from menu 
    where date_repas BETWEEN @Debut AND DATEADD(DAY, 6, @Debut) 
    AND heure = 1

  3. #3
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Par défaut
    Bonjour,

    Merci pour cette réponse, ce bout de code fonctionne très bien.
    Deux questions, toutefois, de compréhension. La première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @Debut = CAST(CONCAT(@annee, '0104') AS DATE) --le 4 janvier est forcément en semaine 1
    SET @Debut = DATEADD(WEEK, @semaine - 1, CAST(CONCAT(@annee, '0104') AS DATE)) -- on rajoute le nombre de semaines voulues
    Ici, la première ligne me semble ne servir à rien, puisque vous réécrivez intégralement cette ligne dans la ligne 2. Ne pourrions-nous pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @Debut = CAST(CONCAT(@annee, '0104') AS DATE) --le 4 janvier est forcément en semaine 1
    SET @Debut = DATEADD(WEEK, @semaine - 1, @Debut) -- on rajoute le nombre de semaines voulues
    J'aurais tendance, ici, à écrire uniquement votre deuxième ligne, et supprimer la première, mais je ne sais pas ce qui est le mieux.

    Seconde question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @Debut = DATEADD(WEEK, DATEDIFF(WEEK, '20191223', @Debut), '20191223') -- on cherche le lundi de cette semaine
    Si j'ai bien compris, on cherche le nombre de semaine de différence entre le 23/12/2019 et notre @debut. Ici, la fonction va chercher les numéros des semaines du 23/12/2019 et du @debut, pour faire la différence. Et on ajoute cette différence au 23/12/2019.
    Du coup, vous avez pris 23/12/2019 parce que c'est un lundi, mais on aurait pu prendre une autre semaine ? Si on prend 16/12/2019 voir même 13/05/2019, cela fonctionnera de la même manière, n'est-ce pas ?
    Et dans ce bout particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEDIFF(WEEK, '20191223', @Debut)
    Le fait qu'on ait pris un lundi ici ne change rien, si on avait pris 25/12/2019 cela aurait fonctionné aussi, puisque le numéro de semaine est le même ? J'ai pu voir, en cherchant des solutions à mon problème, des gens utiliser le 01/01/1900, qui est aussi un lundi. Est-ce qu'il y a une raison particulière à utiliser cette date, ou bien plutôt le 23/12/2019 ?

    Ce sont peut-être des questions triviales, mais je préfère les poser, pour bien comprendre le fonctionnement des dates, qui me semblent parfois assez complexes.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Helianza Voir le message
    Ici, la première ligne me semble ne servir à rien, puisque vous réécrivez intégralement cette ligne dans la ligne 2. Ne pourrions-nous pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @Debut = CAST(CONCAT(@annee, '0104') AS DATE) --le 4 janvier est forcément en semaine 1
    SET @Debut = DATEADD(WEEK, @semaine - 1, @Debut) -- on rajoute le nombre de semaines voulues
    J'aurais tendance, ici, à écrire uniquement votre deuxième ligne, et supprimer la première, mais je ne sais pas ce qui est le mieux.
    Si, tout à fait
    J'étais parti pour décomposer afin de rendre la code plus lisible, mais j'ai oublié de remplacer cette partie par la variable dans la deuxiéme ligne.
    donc oui, on peut tout à fait se passer de la première ligne

    Citation Envoyé par Helianza Voir le message
    Seconde question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @Debut = DATEADD(WEEK, DATEDIFF(WEEK, '20191223', @Debut), '20191223') -- on cherche le lundi de cette semaine
    Si j'ai bien compris, on cherche le nombre de semaine de différence entre le 23/12/2019 et notre @debut. Ici, la fonction va chercher les numéros des semaines du 23/12/2019 et du @debut, pour faire la différence. Et on ajoute cette différence au 23/12/2019.
    Du coup, vous avez pris 23/12/2019 parce que c'est un lundi, mais on aurait pu prendre une autre semaine ? Si on prend 16/12/2019 voir même 13/05/2019, cela fonctionnera de la même manière, n'est-ce pas ?
    re tout à fait

    Citation Envoyé par Helianza Voir le message
    Et dans ce bout particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEDIFF(WEEK, '20191223', @Debut)
    Le fait qu'on ait pris un lundi ici ne change rien, si on avait pris 25/12/2019 cela aurait fonctionné aussi, puisque le numéro de semaine est le même ? J'ai pu voir, en cherchant des solutions à mon problème, des gens utiliser le 01/01/1900, qui est aussi un lundi. Est-ce qu'il y a une raison particulière à utiliser cette date, ou bien plutôt le 23/12/2019 ?
    et re re tout à fait
    pour la date de référence, le 01/01/1900 fonctionne en effet très bien aussi, tant que c'est un lundi. je ne pense pas qu'il y ait des différence de performance en fonction de l'écart entre les dates

  5. #5
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Par défaut
    Merci pour tout

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

Discussions similaires

  1. La commande shortcut n'affiche pas les bonnes infos
    Par DeVit dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 11/05/2011, 14h25
  2. Requete qui n'affiche pas les bonnes valeurs
    Par snips67 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/01/2010, 10h54
  3. il me copie pas les bonnes colonnes
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 27/07/2007, 16h01
  4. SWIG ne genere pas les bonnes methodes!
    Par nezdeboeuf62 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 01/03/2007, 18h24
  5. [SQL] Pb Mysql n'insert pas les bonnes valeur dans la bdd
    Par potao dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 11/02/2007, 03h12

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