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

MS SQL Server Discussion :

Numéro de semaine erroné


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ben_harper
    Inscrit en
    Juin 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2006
    Messages : 141
    Par défaut Numéro de semaine erroné
    Bonjour à tous.

    Voilà j'ai un soucis dans SQL SERVER 2000 version 8.

    J'ai mon n° de semaine qui change à partir du mercredi.
    Je lance une requête qui me dit que la semaine en cours est la semaine 5 et à partir de mercredi on passe en semaine 6.
    Alors que je voudrais que mon n° de semaine change dès le lundi.

    Quelqu'un saurait-il d'où cela peut provenir ?

    Ci-joint une partie du code SQL utilisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select "DEPCOM"."Département Commercial"+N' '+"DEPCOM"."Libellé 
    Département Commercial" AS "C0", CASE WHEN DATEDIFF(DY,DATEADD(DY,3
    ,DATEADD(YY,1,DATENAME(YY,DATEADD( DAY, -3, getdate() )))),DATEADD( DAY, -3, getdate() ))+((DATEPART(DW,DATEADD(DY,3,DATEADD(YY,1,DATENAME(YY,DATEADD( DAY, -3, getdate() )))))+5-@@DATEFIRST)% 7+7)% 7 >=0 THEN 1 WHEN DATEDIFF(DY,DATEADD(DY,3,DATENAME(YY,DATEADD( DAY, -3, getdate() ))),DATEADD( DAY, -3, getdate() ))+((DATEPART(DW,DATEADD(DY,3,DATENAME(YY,DATEADD( DAY, -3, getdate() ))))+5-@@DATEFIRST)% 7+7)% 7 >=0 THEN (DATEDIFF(DY,DATEADD(DY,3
    ,DATENAME(YY,DATEADD( DAY, -3, getdate() ))),DATEADD( DAY, -3, getdate() ))+((DATEPART(DW,DATEADD(DY,3,DATENAME(YY,DATEADD( DAY, -3, getdate() ))))+5-@@DATEFIRST)% 7+7)% 7)/7+1 ELSE (DATEDIFF(DY,DATEADD(DY,3,DATEADD(YY,-1,DATENAME(YY,DATEADD( DAY, -3, getdate() )))),DATEADD( DAY, -3, getdate() ))+((DATEPART(DW,DATEADD(DY,3,DATEADD(YY,-1,DATENAME(YY,DATEADD( DAY, -3, getdate() )))))+5-@@DATEFIRST)% 7+7)% 7)/7+1 END AS "C1", CASE WHEN DATEDIFF(DY,DATEADD(DY,3,DATEADD(YY,1,DATENAME(YY,getdate()))),getdate())+((DATEPART(DW,DATEADD(DY,3,DATEADD(YY,1,DATENAME(YY,getdate()))))+5-@@DATEFIRST)% 7+7)% 7 >=0 THEN 1 WHEN DATEDIFF(DY,DATEADD(DY,3,DATENAME(YY,getdate())),getdate())+((DATEPART(DW,DATEADD(DY,3,DATENAME(YY,getdate())))+5-@@DATEFIRST)% 7+7)% 7 >=0 THEN (DATEDIFF(DY,DATEADD(DY,3,DATENAME(YY,getdate())),getdate())+((DATEPART(DW,DATEADD(DY,3,DATENAME(YY,getdate())))+5-@@DATEFIRST)% 7+7)% 7)/7+1 ELSE (DATEDIFF(DY,DATEADD(DY,3,DATEADD(YY,-1,DATENAME(YY,getdate()))),getdate())+((DATEPART(DW,DATEADD(DY,3,DATEADD(YY,-1,DATENAME(YY,getdate()))))+5-@@DATEFIRST)% 7+7)% 7)/7+1 END AS "C2", getdate() AS "C3", DATEADD( DAY, -3, getdate() )

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Cela dépend de la langue qui est spécifiée pour votre instance SQL Server, et de la valeur que vous pouvez attacher a l'option DATEFIRST au contexte d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET NOCOUNT ON
    SELECT @@DATEFIRST AS PremierJourDeLaSemaine
    SELECT DATEPART(week, GETDATE()) SemaineLundi
    SET DATEFIRST 5
    SELECT DATEPART(week, GETDATE()) SemaineVendredi
    PremierJourDeLaSemaine
    ----------------------
    1

    SemaineLundi
    ------------
    6

    SemaineVendredi
    ---------------
    7
    Pour obtenir la langue de votre instance
    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 995
    Billets dans le blog
    6
    Par défaut
    Attention, parce que le N° de semaine retourné par cette fonction ne corresponda pas du tout aux normes internationales (ISO) qui sont employés dans la majorité du monde (Europe notamment), mais un n° strictement de culture US en décalage avec la norme.

    Pour calculer le N° ISO d'une semaine, vous pouvez faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE FUNCTION dbo.F_ISOWEEK (@DATE datetime)
    RETURNS INT
    AS
    BEGIN
         DECLARE @ISO_WEEK int;
         SET @ISO_WEEK = DATEPART(wk, @DATE) + 1 - DATEPART(wk, CAST(DATEPART(yy, @DATE) AS CHAR(4)) + '0104');
         IF @ISO_WEEK=0
            SET @ISO_WEEK = dbo.F_ISOWEEK(CAST(DATEPART(yy, @DATE) - 1 AS CHAR(4)) + '12' + CAST(24 + DATEPART(DAY, @DATE) AS CHAR(2))) + 1;
         IF DATEPART(mm, @DATE) = 12 AND (DATEPART(dd, @DATE) - DATEPART(dw, @DATE)) >= 28
              SET @ISO_WEEK = 1;
         RETURN @ISO_WEEK;
    END;
     
    GO
    Mais vous gagnerez énormément en performance en faisant en sorte d'implémenter une table des dates avec notamment une colonne N° de semaine et faire des jointures dessus. En effet entre une fonction qui rend toute requête itérative et une jointure qui se traite de manière ensembliste, il n'y a pas photo en terme de perf !
    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/gestiontemps/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éclairé Avatar de ben_harper
    Inscrit en
    Juin 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2006
    Messages : 141
    Par défaut
    Le problème c'est que c'est une requête SQL générée par un rapport, je ne peux donc pas intervenir sur la requête en elle meme.

    J'ai résolu mon problème en mettant DATEFIRST=4

    Merci à tous.

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

Discussions similaires

  1. [Crystal] transformation d'une date en numéro de semaine
    Par barna dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/03/2017, 09h41
  2. [C#] Comment récupérer le numéro de semaine d'une date ?
    Par farfadet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/07/2013, 16h33
  3. Numéro de semaine erroné avec Calendar
    Par peofofo dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 08/08/2011, 08h25
  4. Résultat du Calcul numéro de semaine erroné
    Par jerem7w dans le forum SQL
    Réponses: 2
    Dernier message: 07/09/2010, 13h38
  5. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29

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