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 :

[MSSQLSERVER2008R2]Requete SQL Avec Datediff et gestion des jour Fériés


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de HelpmeMM
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juin 2007
    Messages : 473
    Par défaut [MSSQLSERVER2008R2]Requete SQL Avec Datediff et gestion des jour Fériés
    Bonjour,

    Je fait appel a vous car j'ai une interrogation sur un datediff un peu spécial dans une REQUETE SQL


    En effet je souhaite faire une différence entre 2 date pour récupéré le nombre de jours moins les jours fériés

    Par exemple si je prend
    le Vendredi 21 et le lundi 24 je souhaite que l'on me retourne 1 et non pas 3 de même si je prend le Vendredi 21 et le lundi 31 je souhaite que l'on me retourne 6 et non pas 10 cela doit aussi marché avec les journée comme le 14 juillet ou le 15 aout.

    Si vous avez des solutions sur un algo qui fonctionnerait je suis preneur je continue a chercher de mon coté pour le moment.


    merci à la communauté .

  2. #2
    Invité
    Invité(e)
    Par défaut
    Type de problème régulièrement posé ici, notamment hier...
    Créez une table de date avec un booléen pour férié ou pas et par requête, tu pourras avoir la somme des jours fériés ou pas.

  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 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Inspirez vous de l'article que j'ai écrit à cet effet : 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
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Inspirez vous de l'article que j'ai écrit à cet effet : http://sqlpro.developpez.com/cours/gestiontemps/
    J'avais jamais vu cette article très complet. Merci bien, SQLPro.

  5. #5
    Membre éclairé Avatar de HelpmeMM
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juin 2007
    Messages : 473
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Type de problème régulièrement posé ici, notamment hier...
    Créez une table de date avec un booléen pour férié ou pas et par requête, tu pourras avoir la somme des jours fériés ou pas.
    je vais faire comme si j'avais pas vu la première ligne qui n'apporte évidemment aucun élément de réponse en plus d’être Irritante

    Bref mon problème n'est pas de savoir quand un jour est férié car j'ai déjà une table calendrier construite sur le modèle d'SQlPro qui me ramène par jour le mois, la semaine, l'année, et si le jour est férié oui ou non depuis un bon moment

    Mon problème était surtout de savoir comment l'implémenter dans ma requête, j'ai sans doute du mal m'exprimer.

    En y réfléchissant de plus près le mieux est d'avoir une fonction Sql auquel je fait appel et qui va me ramener un entier X étant mon nombre de jour férié dans mon intervalle de temps

    Merci néanmoins pour les conseils avisés.

  6. #6
    Membre éclairé Avatar de HelpmeMM
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juin 2007
    Messages : 473
    Par défaut
    Au final la solution :

    Code identification des jours fériés : 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
    Create Function [dbo].[JourFerie] (@Date Datetime) returns Bit
    AS 
    Begin
     
    Declare @Jour as integer
    Declare @Mois as integer
    Declare @Annee As Integer
    Declare @Resultat as Bit
    Declare @NbOr as integer
    Declare @Epacte as integer
    Declare @DatePLune as datetime
    Declare @LundiPaques as datetime
    Declare @JeudiAscension as datetime
    Declare @LundiPentecote as datetime
     
     
    set @Jour = Day(@date)
    set @Mois = Month(@date)
    set @Annee = Year(@date)
    set @NbOr = (@Annee % 19) + 1
    set @Epacte = (11 * @NbOr - (3 + round((2 + Round(@Annee / 100,0)) * 3 / 7,0))) % 30
    set @DatePLune = dateadd(day,((@Epacte + 6) % 30) * -1, cast('19/04/' + cast(@Annee as varchar(4)) as datetime))
     
    set @DatePLune = dateadd(day, case when @Epacte = 24 
    								or (@Epacte = 25 and @Annee >= 1900 and @Annee < 2000 ) 
    							then - 1
    				else 0
    			end, @DatePLune)
     
    set @LundiPaques = dateAdd(day, 8 - datepart(weekday,@DatePLune), @DatePLune)
     
    set @JeudiAscension = dateadd(day,38,@LundiPaques)
     
    set @LundiPentecote = dateadd(day,11,@JeudiAscension)
     
    set @Resultat = 
    Case 
    	when left(convert(varchar(10),@Date,103),5) 
    		in ('01/01','01/05','08/05','14/07','15/08','01/11','11/11','25/12')
    		or @Date in (@LundiPaques,@JeudiAscension,@LundiPentecote) then 1
    	else 0
    end 
     
    return @Resultat
     
    end 
    GO


    Code Calcul du nombre de jour férié entre deux dates : 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
    CREATE Function [dbo].[NBJourFerie] (@DateDebut Datetime,@DateFin Datetime) returns Integer
     
    Begin
    Declare @NbJourFerie as Integer
     
    Set @NbJourFerie =(
    Select Sum(NbJourFerie)from(
    Select Case when Dbo.F_ISO_WEEKDAY(Jour)=6 then 1
    			when Dbo.F_ISO_WEEKDAY(Jour)=7 then 1 
    			else  Dbo.JourFerie(jour)end as NbJourFerie,jour  
    			from TBA_Calendrier
    			where Jour Between  @DateDebut and @DateFin) As T
    )
    return @NbJourFerie
     
    end

    POur la somme du nb de jour férié j'utilise une fonction F_Iso_weekday qui n'est pas présenté ici car facile a trouver sur le net. Cette fonction a le mérite de calculé a la volé mon nb de jour férié et évite ainsi toute modification dans la table Calendrier.

  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 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Je voit pas l'intérêt d'une UDF à moins de vouloir pourrir sciemment les perf.

    Si vous avez une colonne FERIE de type BIT dans votre table de date, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(FERIE)
    FROM   T_DATES
    WHERE JOUR BETWEEN ???debut??? AND ???FIN???
    Avec un index sur JOUR + FERIE, c'est instantané.

    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 éclairé Avatar de HelpmeMM
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juin 2007
    Messages : 473
    Par défaut
    il y a deux raisons à ce choix :

    1-Tout simplement car je suis sur une table qui contient moins de 100 000 enregistrements et que les perfs ne sont clairement pas un problème pour moi
    et ne sont pas pres de le devenir

    2- car cela est clairement plus simple a gérer puisque cela m'évite de rajouter des jointures. La finalité n'étant pas de récupérer le nombre de jours férié mais de calculer une durée en minutes entre deux date suivant d'autres paramètres. D'autant que ma table calendrier est dans une autre bases de donnée et que je ne souhaite pas la dupliqué dans cette base.

    peut être qu'effectivement sa pourrie les perfs mais ce n'est pas ce que dit le rendu de mon état qui est instantané le nombre de donnée traité avec les différents filtres dépassant rarement le millier.

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

Discussions similaires

  1. [X3V6] gestion des jours fériés
    Par castorameur dans le forum SAGE
    Réponses: 1
    Dernier message: 24/04/2015, 08h04
  2. Exemple de gestion des jours fériés
    Par StringBuilder dans le forum Langage SQL
    Réponses: 9
    Dernier message: 24/08/2012, 15h10
  3. Faire des requetes SQL avec Zend
    Par leroidje dans le forum Zend_Db
    Réponses: 14
    Dernier message: 13/05/2012, 01h57
  4. requete SQL avec des Parametres
    Par devlopassion dans le forum C++Builder
    Réponses: 7
    Dernier message: 18/11/2006, 11h52
  5. requete sql avec between sur des champs de type Date
    Par ersoufiane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/08/2006, 19h43

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