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 :

Calcul d'heure supérieur à 24 h [2008]


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Par défaut Calcul d'heure supérieur à 24 h
    Dans ma table j'ai une date de début au format 01/01/2014 07:00:00 et une date de fin 03/01/2014 19:00:00.
    Lorsque j'édite ma requête par : CONVERT(VARCHAR,(PLA.DH_FIN_SPEC-PLA.DH_DEBUT_SPEC),108), si ce délai dépasse 24 h mon résultat est 00:00:00, résultat réel : 60:00:00.
    Mon but est de faire apparaître le nombre réel effectué par tranche puis de faire une somme de toutes les tranches.
    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
     
    SELECT DISTINCT PER.NOM_PERSONNEL +' '+ REPLACE(PER.PRENOM_PERSONNEL,'V','') AS NOM_PERSONNEL ,
                               PLA.CODE_FCTOCCUPEE AS Fonction,
                               PLA.DH_DEBUT_SPEC,
                               PLA.DH_FIN_SPEC,
                               CONVERT(VARCHAR,(PLA.DH_FIN_SPEC-PLA.DH_DEBUT_SPEC),108),
                               CASE WHEN PLA1.CODE = 5 THEN 'Ast. CDT' ELSE 'Astreinte' END AS Etat,
                               PLA1.LIBELLE_COURT,
                               YEAR(PLA.[DH_DEBUT_SPEC])
     
    FROM                  PERSONNEL PER   
                                       INNER JOIN   PLANNINGS_CALENDRIER_SPEC   PLA 
                                                    ON PER.[MATRICULE] = PLA.[MATRICULE] 
                                       INNER JOIN   PLANNINGS_ETAT   PLA1 
                                                    ON PLA.[ETAT] = PLA1.[CODE] 
                                       INNER JOIN   AFFECTATION  AFF 
                                                    ON AFF.[MATRICULE] = PER.[MATRICULE] 
                                                  AND AFF.[NUMERO_CENTRE] = PER.[NUMERO_CENTRE]
                                       INNER JOIN FONCTION_OCCUPEE_PERSONNEL FOP
                                                    ON FOP.MATRICULE = AFF.MATRICULE
                                                   AND FOP.NUMERO_CENTRE = AFF.NUMERO_CENTRE
     
    WHERE            YEAR(PLA.[DH_DEBUT_SPEC]) >= 2014
                          AND PLA.CODE_FCTOCCUPEE = 'SOUSAN'
                          AND PLA1.LIBELLE_COURT NOT LIKE 'IND'
    Vous en remerciant par avance.

    Cordialement

  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,

    Normal, le format que vous utilisez est fait pour manipuler des heures(de la journée), pas des durées...
    Par ailleurs, votre façon de soustraire des dates ne convient pas.

    Utilisez la fonction datediff pour récupérer une durée en secondes, en minutes ou en heure (en fonction de la précision voulue), et formatez "manuellement" le résultat obtenu

  3. #3
    Membre confirmé
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Par défaut Calcul d'heure supérieur à 24 h
    Qu'appelez vous formater manuellement ?

    Mes connaissances ne vont pas aussi loin...

    Merci.

  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
    dans votre exemple, si vous effectuez la différence en heures, vous obtiendrez 60.
    Il vous restera à le formater, en utilisant les fonctions chaines, en "60:00:00", selon votre besoin précis

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je suis de bonne humeur ce matin et je vais te mâcher le travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    --Différence en seconde entre deux dates :
    declare @dat1 datetime
    declare @dat2 datetime
    declare @duree_en_secondes int
     
    SET @dat1 = '1989-07-14'
    SET @dat2 = getdate()
     
    SELECT @duree_en_secondes = DATEDIFF(SECOND, @dat1, @dat2)
    SELECT @duree_en_secondes 
     
    ----- résultat -----
    789123135
    Ensuite il y a cette fonction (qui vaut ce qu'elle vaut, j'en suis conscient, mais qui dépanne) :
    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
     
    -- =============================================
    -- Author:		7gyY9w1ZY6ySRgPeaefZ
    -- Create date: 2013-04-02
    -- Description:	renvoie un affichage lisible à partir d'un nombre de secondes
    -- =============================================
    CREATE FUNCTION [dbo].[ufn_affichage_propre_a_partir_de_secondes] 
    	( @Nombre_secondes BIGINT = 0 )
    RETURNS varchar(500)
    AS 
    BEGIN
    	DECLARE @retour varchar(500) = ''
    	if @Nombre_secondes / 86400 > 0 
    		set @retour = cast( @Nombre_secondes / 86400 as varchar(50)) + ' jour'
    			+ case when @Nombre_secondes / 86400 > 1 then 's ' else ' ' end
     
    	set @retour = @retour + cast( CONVERT( TIME(0), DATEADD ( SECOND, @Nombre_secondes, 0 ) ) as varchar(150))
    	return @retour
    END
    GO
    et là tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [dbo].[ufn_affichage_propre_a_partir_de_secondes]  ( @duree_en_secondes ) 
    ----- résultat -----
    9133 jours 08:52:15

  6. #6
    Membre confirmé
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Par défaut Calcul d'heure supérieur à 24 h
    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
    SELECT DISTINCT PER.NOM_PERSONNEL +' '+PER.PRENOM_PERSONNEL AS NOM_PERSONNEL ,
                    PLA.CODE_FCTOCCUPEE AS Fonction,
                    PLA.DH_DEBUT_SPEC AS Debut,
                    PLA.DH_FIN_SPEC AS Fin,
                    DATEDIFF(HH,PLA.DH_DEBUT_SPEC,PLA.DH_FIN_SPEC) AS Duree,
                    CASE WHEN PLA1.CODE = 5 THEN 'Ast. CDT' ELSE 'Astreinte' END AS Etat,
                    YEAR(PLA.[DH_DEBUT_SPEC]) AS Annee
     
    FROM            PERSONNEL PER INNER JOIN PLANNINGS_CALENDRIER_SPEC PLA 
                                        ON PER.[MATRICULE] = PLA.[MATRICULE] 
                                  INNER JOIN   PLANNINGS_ETAT   PLA1 
                                        ON PLA.[ETAT] = PLA1.[CODE] 
                                  INNER JOIN   AFFECTATION  AFF 
                                        ON AFF.[MATRICULE] = PER.[MATRICULE] 
                                        AND AFF.[NUMERO_CENTRE] = PER.[NUMERO_CENTRE]
                                  INNER JOIN FONCTION_OCCUPEE_PERSONNEL FOP
                                        ON FOP.MATRICULE = AFF.MATRICULE
                                        AND FOP.NUMERO_CENTRE = AFF.NUMERO_CENTRE
     
    WHERE           YEAR(PLA.[DH_DEBUT_SPEC]) = 2014
                    AND PLA.CODE_FCTOCCUPEE = 'SOUSAN'
                    AND PLA1.LIBELLE_COURT NOT LIKE 'IND'
     
    GROUP BY        PER.NOM_PERSONNEL +' '+PER.PRENOM_PERSONNEL ,
                    PLA.CODE_FCTOCCUPEE,
                    PLA.DH_DEBUT_SPEC,
                    PLA.DH_FIN_SPEC,
                    CASE WHEN PLA1.CODE = 5 THEN 'Ast. CDT' ELSE 'Astreinte' END,
                    YEAR(PLA.[DH_DEBUT_SPEC])
    Pour vous, cela parait évident, mais je reconnais que les calculs d'heure sont un enfer pour moi et que lorsque j'aurai compris comment cela fonctionne, j'aurai réglé pas mal de problème.
    Donc, à partir de cette requête, j'ai bien mon DATEDIFF qui fonctionne même au delà de 24 h. Néanmoins, j'ai plusieurs tranches qui apparaissent dans le mois à des jours et horaires différents. Il ne me reste plus qu'à faire la somme de ces heures. Si je passe par la fonction SUM, cela ne fonctionne pas, ce que j'arrive aisément à comprendre puisque les nombres affichées ne sont pas au format numérique.

    Et là, je bloque totalement...

    ordialee

  7. #7
    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
    ça devrait pourtant fonctionner !
    DATEDIFF renvoit bien des nombres, des INT précisément

    par contre, il faut sans doute retirer les colonnes PLA.DH_DEBUT_SPEC et PLA.DH_FIN_SPEC de votre group by (et du coup de la liste du SELECT)

  8. #8
    Membre confirmé
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Par défaut Calcul d'heure supérieur à 24 h
    Lorsque je fait mon DATEDIFF, je mets tout en minute soit 12 h = 720 mn.
    Je supprime de mon select mes DH Debut et Fin, je met SUM(DATEDIFF(MI,PLA.DH_DEBUT_SPEC,PLA.DH_FIN_SPEC)) et il me sors un nombre incohérent.
    Ex: 1 agent fait 8 gardes de 720 mn = 5760
    Lorsque je l'édite dans la requête, il me sors 57600. Même si je divise par 10 je retomberai bien sur le nombre voulu mais cette opération me paraît incohérente.

  9. #9
    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
    ça sent la condition de jointure manquante, qui a pour effet de multiplier le nombre de ligne (d'où votre somme faussée, multipliée par 10)

    vérifiez vos jointures, et si vous ne trouvez rien, vérifiez vos données sans le SUM/group by...

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    Citation Envoyé par Taz 31 Voir le message
    Lorsque je fait mon DATEDIFF, je mets tout en minute soit 12 h = 720 mn.
    Je supprime de mon select mes DH Debut et Fin, je met SUM(DATEDIFF(MI,PLA.DH_DEBUT_SPEC,PLA.DH_FIN_SPEC)) et il me sors un nombre incohérent.
    Ex: 1 agent fait 8 gardes de 720 mn = 5760
    Lorsque je l'édite dans la requête, il me sors 57600. Même si je divise par 10 je retomberai bien sur le nombre voulu mais cette opération me paraît incohérente.
    Si vous êtes vraiment sur des votre requête, vous pouvez essayer un rebuild des indexes des tables concernées.
    J'ai eu un cas de résultats incohérent il y a quelques jours.

    Bon je dis ça, c'est surement un coup pour rien car c'est assez rare.
    Mais au moins c'est dit

    A+

  11. #11
    Membre confirmé
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Par défaut Calcul d'heure supérieur à 24 h
    Effectivement, j'avais une jointure en trop.

    Merci pour votre aide.

    Cordialement.

    Taz

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

Discussions similaires

  1. calcul des heures
    Par meddeb2001 dans le forum Access
    Réponses: 2
    Dernier message: 06/07/2006, 17h55
  2. probleme avec le calcul des heures
    Par aibar dans le forum Access
    Réponses: 1
    Dernier message: 14/06/2006, 00h38
  3. [VBA-E] somme d'heures supérieures à 24h
    Par bandit boy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/05/2006, 15h02
  4. [VBA-e] Calcul d'heure
    Par climz dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 11/05/2006, 16h02
  5. [Dates] Calcul d'heure
    Par Kyvin dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2006, 08h13

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