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 :

Calcul du numéro de semaine associé à l'année


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 14
    Points
    14
    Par défaut Calcul du numéro de semaine associé à l'année
    Bonjour à tous,

    Je sais que cette demande a déjà été maintes fois, mais je n'ai pas su trouver ce qui pourrai répondre à mon besoin. Du coup je galère, mes connaissances étant limitées.
    Ma question : Je cherche à associer l'année et le n° de semaine d'une date, comme ça : 201801 !
    Exemple : je sais faire pour la date du 30 décembre 2018 qui donne 201852. J'ai utilisé year et datepart(iso_week,getdate()). Mais pour le 31 décembre 2018, ça marche plus, je trouve 201801 alors qu'il faudrait trouver 201901 ! !
    Comment faire ?

    Merci de votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    En cherchant dans les forum, je suis tombé sur une commande YearWeek, qui est exactement ce que je cherche. Mais à priori, elle ne fonctionne pas sur SQL.
    Pouvez-vous me dire s'il existe un équivalent ?

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Quelque chose dans ce gout là, a bien tester sur les différents cas limite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @dte DATE
     
    SET @dte = '20181230'
     
    SELECT CONCAT(
        YEAR(@dte) 
        + CASE WHEN MONTH(@dte) = 12 AND DATEPART(ISO_WEEK,@dte) = 1 THEN 1 ELSE 0 END
        , CASE WHEN DATEPART(ISO_WEEK,@dte) < 10 THEN '0' ELSE '' END
        , DATEPART(ISO_WEEK,@dte)
    )

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Bonjour aieeeuuuuu,

    C'est bien ce que je cherche à réaliser ! Merci.

    J'ai fait quelques tests ... concluants .... jusqu'à 20151228 qui donne bien 201553, mais 20160103 de la même semaine donc donne 201653 au lieu de 201553 ! !

  5. #5
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    ha oui, il faut prévoir le cas inverse alors :

    comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CONCAT(
        YEAR(@dte) 
        + CASE WHEN MONTH(@dte) = 12 AND DATEPART(ISO_WEEK,@dte) = 1 THEN 1 ELSE 0 END
        - CASE WHEN MONTH(@dte) = 1 AND DATEPART(ISO_WEEK,@dte) > 50 THEN 1 ELSE 0 END
        , CASE WHEN DATEPART(ISO_WEEK,@dte) < 10 THEN '0' ELSE '' END
        , DATEPART(ISO_WEEK,@dte)
    )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Excellent ! !
    je n'ai pas pu mettre le code en erreur, donc tout va bien.
    Il ne me reste plus qu'à essayer de l'intégrer dans mon programme.

    Pour info : que veux dire les + - et , devant chaque CASE ?
    J'imagine que le + permet la concaténation, mais les deux autres ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Je pense que ceci serait plus correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE @DATE DATE = '2018-12-31'
    SELECT datepart(iso_week, @DATE) AS NUM_SEMAINE,
           CASE 
             WHEN datepart(iso_week, @DATE) = 1  AND MONTH(@DATE) = 12 THEN YEAR(@DATE) + 1
    		 WHEN datepart(iso_week, @DATE) = 53 AND MONTH(@DATE) = 1 THEN YEAR(@DATE) - 1
    		 ELSE YEAR(@DATE)
    	   END AS YEAR_WEEK
    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/ * * * * *

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    OK, là je comprends mieux : +1 pour augmenter l'année et -1 pour la diminuer.

    Comment modifier ce code pour que DATE = '2018-12-31' ne soit plus une valeur figée, mais les données d'une colonne ?

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Supprimez la ligne DECLARE
    Remplacer @DATE par le nom de votre colonne.

    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/ * * * * *

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    OK, sauf que ma date est le résultat du calcul ci-après :

    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
    CASE dbo.VENTE.TYPEPIECE 
    WHEN '2' THEN 
              CASE WHEN dbo.VENTE.TYPEPIECE = '2' AND dbo.COMMANDE.DELAICALCULE IS NULL
              THEN DATEADD(day, 15, dbo.VENTE.DATECOMMANDE) 
              ELSE dbo.COMMANDE.DELAICALCULE 
              END 
    WHEN '3' THEN 
              CASE WHEN dbo.VENTE.TYPEPIECE = '3' 
              THEN dbo.VENTE.DATEPIECE 
              END 
    WHEN '4' THEN 
              CASE WHEN dbo.VENTE.TYPEPIECE = '4' AND dbo.VENTE.DATEBL IS NULL 
              THEN dbo.VENTE.DATEFACTURE 
              ELSE dbo.VENTE.DATEBL 
              END 
    END)
    Est-il possible de charger la variable @DATE avec ce calcul, ce qui me permettrait de garder l'écriture que vous proposez et m'éviterais de répéter mon calcul ci-dessus autant de fois qu’apparaît la variable dans votre code (c'est à dire 8 fois) !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    datepart(iso_week, @DATE) AS NUM_SEMAINE,
           CASE 
             WHEN datepart(iso_week, @DATE) = 1  AND MONTH(@DATE) = 12 THEN YEAR(@DATE) + 1
    		 WHEN datepart(iso_week, @DATE) = 53 AND MONTH(@DATE) = 1 THEN YEAR(@DATE) - 1
    		 ELSE YEAR(@DATE)
    	   END AS YEAR_WEEK
    J'espère me faire comprendre, je suis débutant autodidacte et vous remercie par avance.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Utilisez une CTE....

    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
    24
    25
    26
    27
    28
    29
    WITH T0 AS
    (
    SELECT ...
           CASE dbo.VENTE.TYPEPIECE 
              WHEN '2' THEN 
              CASE WHEN dbo.VENTE.TYPEPIECE = '2' AND dbo.COMMANDE.DELAICALCULE IS NULL
                 THEN DATEADD(day, 15, dbo.VENTE.DATECOMMANDE) 
                 ELSE dbo.COMMANDE.DELAICALCULE 
              END 
              WHEN '3' THEN 
              CASE WHEN dbo.VENTE.TYPEPIECE = '3' 
                 THEN dbo.VENTE.DATEPIECE 
              END 
              WHEN '4' THEN 
                 CASE WHEN dbo.VENTE.TYPEPIECE = '4' AND dbo.VENTE.DATEBL IS NULL 
                    THEN dbo.VENTE.DATEFACTURE 
                    ELSE dbo.VENTE.DATEBL 
              END 
           END AS MA_DATE
    FROM   ...
    )
    SELECT *, 
           datepart(iso_week, @DATE) AS NUM_SEMAINE,
           CASE 
              WHEN datepart(iso_week, MA_DATE) = 1 AND MONTH(MA_DATE) = 12 THEN YEAR(MA_DATE) + 1
              WHEN datepart(iso_week, MA_DATE) = 53 AND MONTH(MA_DATE) = 1 THEN YEAR(MA_DATE) - 1
              ELSE YEAR(MA_DATE)
           END AS YEAR_WEEK
    FROM   T0

    Entre nous votre requêtes est super lourdingue et probablement farcies de conneries…

    1) TYPEPIECE est -il numérique ou littéral ?
    2) Pourquoi faire des case imbriqués ?

    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
    24
    25
    26
    WITH T0 AS
    (
    SELECT CASE  
              WHEN TYPEPIECE = '2' AND DELAICALCULE IS NULL 
                 THEN DATEADD(day, 15, DATECOMMANDE) 
              WHEN DELAICALCULE IS NOT NULL 
                 THEN DELAICALCULE 
              WHEN WHEN TYPEPIECE = '3' 
                 THEN DATEPIECE 
              WHEN TYPEPIECE '4' AND DATEBL IS NULL 
                 THEN DATEFACTURE 
              WHEN DATEBL IS NULL
                 THEN DATEBL 
           END AS MA_DATE
    FROM   dbo.VENTE
           JOIN dbo.COMMANDE
              ON ???
    )
    SELECT *, 
           datepart(iso_week, @DATE) AS NUM_SEMAINE,
           CASE 
              WHEN datepart(iso_week, MA_DATE) = 1 AND MONTH(MA_DATE) = 12 THEN YEAR(MA_DATE) + 1
              WHEN datepart(iso_week, MA_DATE) = 53 AND MONTH(MA_DATE) = 1 THEN YEAR(MA_DATE) - 1
              ELSE YEAR(MA_DATE)
           END AS YEAR_WEEK
    FROM   T0
    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/ * * * * *

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/11/2011, 13h30
  2. Calculer le numéro de semaine d'une date
    Par chandlerbing77 dans le forum Access
    Réponses: 2
    Dernier message: 09/06/2006, 12h26
  3. [excel]calcul du numéro de semaine
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/10/2005, 11h57
  4. [Calendar] Problème de numéro de semaine de l'année
    Par gaia_dev dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 29/11/2004, 11h44
  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