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 d'une durée en jour - week end et changement d'année [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Par défaut Calcul d'une durée en jour - week end et changement d'année
    Bonjour à tous,

    Je cherche à calculer la durée en nombre de jours entre deux dates en excluant les jours du week-end.
    En effectuant quelques recherches je suis tombé sur plusieurs blogs/forums comme ici ou ...

    J'ai adapté un petit peu car ils considèrent que le début de la semaine c'est le dimanche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- Diff en nb de jours entre deux dates
    SELECT DATEDIFF(d, DATE_DEB, DATE_FIN)
           - 2 * (DATEPART(ISO_WEEK,DATE_FIN) - DATEPART(ISO_WEEK,DATE_DEB)) -- Suppression de 2 jours par semaines
           + (CASE WHEN DATEPART(dw, DATE_DEB) = 7 THEN 1 ELSE 0 END) -- Tout evt débutant le dimanche est considéré comme débutant le lundi (idem pour le samedi mais pas d'exception à gérer)
           - (CASE WHEN DATEPART(dw, DATE_FIN) = 7 THEN 1 ELSE 0 END)-- Tout evt terminant le dimanche est considéré comme terminant le lundi (idem pour le samedi mais pas d'exception à gérer)
    J'ai effectué quelques tests et, à mon avis, ça ne fonctionne pas.
    En effet, il m'arrive de commencer une chose en décembre et de la finir en janvier et comme les numéros des semaines sont remis à zéro en début d'année, la suppression de deux jours par semaines ajoute 104 ou 106 jours selon les cas...

    Ci dessous mes cas de tests :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    DECLARE @TABLE TABLE (EVT INT, DATE_DEB DATETIME, DATE_FIN DATETIME)
     
    -- Cas simple
    INSERT @TABLE SELECT 1, '15/08/2016 09:00:00.000', '16/08/2016 09:00:00.000'
     
    -- Cas de changement de semaine
    INSERT @TABLE SELECT 2, '05/08/2016 09:00:00.000', '08/08/2016 09:00:00.000'
     
    -- Cas de début un samedi
    INSERT @TABLE SELECT 3, '06/08/2016 09:00:00.000', '08/08/2016 09:00:00.000'
     
    -- Cas de début un dimanche
    INSERT @TABLE SELECT 4, '07/08/2016 09:00:00.000', '08/08/2016 09:00:00.000'
     
    -- Cas de fin un samedi
    INSERT @TABLE SELECT 5, '05/08/2016 09:00:00.000', '06/08/2016 09:00:00.000'
     
    -- Cas de fin un dimanche
    INSERT @TABLE SELECT 6, '05/08/2016 09:00:00.000', '07/08/2016 09:00:00.000'
     
    -- Cas de début un samedi et de fin un dimanche
    INSERT @TABLE SELECT 7, '06/08/2016 09:00:00.000', '07/08/2016 09:00:00.000'
     
    -- Cas de début un samedi et de fin un samedi
    INSERT @TABLE SELECT 8, '06/08/2016 09:00:00.000', '06/08/2016 09:00:00.000'
     
    -- Cas de début un dimanche et de fin un dimanche
    INSERT @TABLE SELECT 9, '07/08/2016 09:00:00.000', '07/08/2016 09:00:00.000'
     
    -- Cas de reset du numéro de semaine
    -- le 01/01/2016 nous étions semaine 53 et le 04/01/2016 semaine 1
    INSERT @TABLE SELECT 10, '01/01/2016 09:00:00.000', '04/01/2016 09:00:00.000'
     
    SELECT EVT,
           DATE_DEB,
           DATE_FIN,
           DATENAME(dw, DATE_DEB) AS JOUR_DEB,
           DATEPART(ISO_WEEK,DATE_DEB) AS SEM_DEB,
           DATENAME(dw, DATE_FIN) AS JOUR_FIN,
           DATEPART(ISO_WEEK,DATE_FIN) AS SEM_FIN,
           -- Diff en nd de jours entre deux dates
           DATEDIFF(d, DATE_DEB, DATE_FIN) -- Suppression de 2 jours par semaines
           - 2 * (DATEPART(ISO_WEEK,DATE_FIN) - DATEPART(ISO_WEEK,DATE_DEB)) -- Tout evt débutant le dimanche est considéré comme débutant le lundi (idem pour le samedi mais pas d'exception à gérer)
           + (CASE WHEN DATEPART(dw, DATE_DEB) = 7 THEN 1 ELSE 0 END) -- Tout evt terminant le dimanche est considéré comme terminant le lundi (idem pour le samedi mais pas d'exception à gérer)
           - (CASE WHEN DATEPART(dw, DATE_FIN) = 7 THEN 1 ELSE 0 END)
           AS DureeJour
    FROM   @TABLE
    Je me suis peut-être raté dans l'adaptation pour le calendrier français mais il me semble pas que le changement d'année soit géré dans la version originale.

    Lorsque j'essaye de le gérer je multiplie les CASE, ça devient illisible et ça ne résout rien...

    Est-il possible de gérer le changement d'année à partir de cette méthode de calcul ?
    Ou existe-il un autre moyen simple (sans table de référence) pour gérer la durée entre deux dates sans compter les week-end et qui prend en compte le changement d'année ?

    Par avance, merci.

  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,

    Vous pouvez tenter ceci (sensible au paramètrage DATEFIRST)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           DATEDIFF(DAY, DATE_DEB, DATE_FIN) 
           - 2 * (DATEDIFF(WEEK, DATE_DEB, DATE_FIN)) 
           - (CASE WHEN DATEPART(dw, DATE_DEB) = 7 THEN 1 ELSE 0 END) 
           + (CASE WHEN DATEPART(dw, DATE_FIN) = 7 THEN 1 ELSE 0 END)
           AS DureeJour
    Mais si vous êtes amené a faire régulièrement ce genre de requêtes, voire des requêtes plus subtiles (prise en compte des jours fériés) il serait certainement utile de doter votre base de données de tables de calendrier

  3. #3
    Membre éclairé
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Par défaut
    Merci pour cette réponse rapide aieeeuuuuu.

    C'est super, ça fonctionne maintenant.

    J'ai, en effet, mal adapté le calcul pour le calendrier français, il suffisait de changer le signe du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (CASE WHEN DATEPART(dw, DATE_FIN) = 7 THEN 1 ELSE 0 END)
    Je me suis un peu emballé sur la première partie et c'est vrai qu'en y réfléchissant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - 2 * (DATEPART(ISO_WEEK,DATE_FIN) - DATEPART(ISO_WEEK,DATE_DEB))
    est différent de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - 2 * (DATEDIFF(WEEK, DATE_DEB, DATE_FIN))
    à cause du changement d'année justement !!

    En tout cas merci beaucoup, je vais lire le billet d'SQLPro et voir pour l’implémentation d'une table calendrier...

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

Discussions similaires

  1. [V6] Calcul d'une durée en année mois jours
    Par herve rennes dans le forum Deski
    Réponses: 7
    Dernier message: 11/02/2009, 23h37
  2. Calcul d'une durée moyenne
    Par Aurazed dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/07/2007, 08h40
  3. [VBA] Calcul d'une durée dans un formulaire
    Par Platon93 dans le forum Access
    Réponses: 2
    Dernier message: 16/12/2006, 16h53
  4. Réponses: 7
    Dernier message: 05/07/2006, 16h29
  5. CALCUL D UNE DUREE ENTRE 2 DATES SANS LES DIMANCHES
    Par sarahsonia dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/04/2006, 17h12

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