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 de durée exprimé en HH:MM:SS


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Calcul de durée exprimé en HH:MM:SS
    Bonjour ,

    J'ai besoin de calculer une durée entre deux dates ( au format : YYYY-MM DD HH:MM:SS ) et obtenir le résultat en HH:MM:SS.


    Je ne vois pas comment faire en utilisant la fonction DATEDIFF()


    Merci pour votre aide!

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    DATEDIFF te permet de récupéer par exemple le nombre de secondes entre les deux dates.

    Ensuite, en divisant successivement 2 fois le résultat par 60, tu retrouveras les minutes et les heures.

    A noter que ces division n'incombent pas au SGBD, c'est à ton application cliente de faire ce genre de calculs. Déjà le DATEDIFF ne devrait même pas être utilisé dans ton cas, si c'est juste pour récupérer de façon lisible la différente entre les deux dates (c'est à ton programme de faire la soustraction dans ce cas, pas à SQL Server)
    On ne jouit bien que de ce qu’on partage.

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    DATEDIFF te permet de récupéer par exemple le nombre de secondes entre les deux dates.

    Ensuite, en divisant successivement 2 fois le résultat par 60, tu retrouveras les minutes et les heures.

    A noter que ces division n'incombent pas au SGBD, c'est à ton application cliente de faire ce genre de calculs. Déjà le DATEDIFF ne devrait même pas être utilisé dans ton cas, si c'est juste pour récupérer de façon lisible la différente entre les deux dates (c'est à ton programme de faire la soustraction dans ce cas, pas à SQL Server)
    et les vues alors, à quoi serviraient-elles ?

    1) une fonction (UDF) pour ce 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    CREATE FUNCTION dbo.F_CONVERT_S_HMS (@S INT) 
    RETURNS VARCHAR(8)
    AS 
    BEGIN
    DECLARE @H INTEGER, @M INTEGER, @RETVAL VARCHAR(8);
    -- cas trivial
    IF @S IS NULL
       RETURN NULL;
    -- récupération des heures, minutes
    SET @H = @S / 3600;
    SET @S = @S % 3600;
    SET @M = @S / 60;
    SET @S = @S % 60;
    -- formattage
    IF @H < 10
       SET @RETVAL = '0'+CAST(@H AS CHAR(1))+':'
    ELSE
       SET @RETVAL = CAST(@H AS CHAR(2))+':';
    IF @M < 10
       SET @RETVAL = @RETVAL + '0' + CAST(@M AS CHAR(1))+':'
    ELSE
       SET @RETVAL = @RETVAL + CAST(@M AS CHAR(2))+':';
    IF @S < 10
       SET @RETVAL = @RETVAL + '0' + CAST(@S AS CHAR(1))
    ELSE
       SET @RETVAL = @RETVAL + CAST(@S AS CHAR(2));
       -- retour
    RETURN @RETVAL;
    END
    GO
    Une vue avec : dbo.F_CONVERT_S_HMS(DATEDIFF(second, datedebut, datefin))

    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
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par ju1571 Voir le message
    J'ai besoin de calculer une durée entre deux dates ( au format : YYYY-MM DD HH:MM:SS ) et obtenir le résultat en HH:MM:SS.
    HH:MM:SS de type VARCHAR(8) ou TIME (c.a.d. SQL2008 et postérieur, donc pour des durées inférieures à 1 jour) ?

    Citation Envoyé par ju1571 Voir le message
    Je ne vois pas comment faire en utilisant la fonction DATEDIFF()
    DATEDIFF(second, DateDebut, DateFin) va renvoyer le nombre de secondes.

    1. DATEDIFF(second, DateDebut, DateFin) / 3600 va renvoyer le nombre d'heures,
    2. (DATEDIFF(second, DateDebut, DateFin) % 3600) / 60 va renvoyer le nombre de minutes restantes,
    3. DATEDIFF(second, DateDebut, DateFin) % 60 va renvoyer le nombre de secondes restantes.

    Il suffit d'assembler le tout correctement...
    Philippe.

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    et les vues alors, à quoi serviraient-elles ?
    Euh... J'avoue que je ne comprends pas très bien ta réponse.

    Généralement, je me sers de vues pour rendre accessible des données calculées/filtrées, principalement pour des traitements, ou en vue de simplification du code.

    Ici il s'agit de faire de la mise en forme (localisée qui plus est) du coup, vue ou pas vue, je suis étonné que tu préconises une vue dans ce cas.

    N'est pas plus logique, dans ce cas, de garder un select datedebut, datefin from matable et laisser à l'application cliente le soin de faire la différence entre les deux et faire le formatage ?

    Et si on a besoin de la différence entre les deux dates dans un traitement, la donnée brute exprimée dans un datepart donné devrait être suffisante, plutôt qu'une valeur formatée impossible à trier/comparer, non ?
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci a tous pour vos réponse!!

    Pour infos : je ne peux pas créer de vue ni de table !!!

    Je ne vois pas comment je peux assembler plusieurs DATEDIFF ensemble?

    Avec un DATEADD?
    Merci !

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Bon, ben ça confirme bien ce que je disais.

    C'est à ton application cliente (PHP, Java, C++, C#, VB ou ce que tu veux) de faire cette mise en forme.

    Voici une requête SQL qui va le faire, mais ça donne autant envie de vomir que de se tirer une balle quand on doit la relire...

    Franchement, mise à part s'il y a un autiste trisomique dans ta boîte pour faire la maintenance, évite...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select concat(right(cast((s / 3600) + 100 as char(3)), 2), ':', right(cast((s % 3600) / 60 + 100 as char(3)), 2), ':', right(cast(((s % 3600) % 60) + 100 as char(3)), 2)) temps
    from (
       select DATEDIFF(second, datdeb, datfin) s
       from tatable
    ) diff

    Alors qu'en C# par exemple, t'as juste à faire :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String.Format("{0:t}", datfin.Subtract(datdeb));

    C'est quand même autrement plus lisible, incontestablement plus performant et surtout plus simple à comprendre...
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    je suis d'accord avec toi elle donne envie de vomir !! mais du moment qu'elle marche ;-)

    merci !!!

    A tout hasard est ce que quelqu'un serait comment je peux convertir une date/ heure ('2014-04-28 13:10:10') avec le fuseaux horaire 'Europe/ Paris' .

    Je sais que avec Oracle il suffit d'utilise le FROM_TZ mais avec SQL Server , je suis bloqué...

    Merci d'avance

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/12/2006, 17h43
  2. [MySQL] Aide pour calculer une durée
    Par Sandara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/06/2006, 17h00
  3. Calculer la duree d'un MP3
    Par k-koo dans le forum C
    Réponses: 4
    Dernier message: 16/03/2006, 21h01
  4. [Date] Fonction de calcul de durée entre 2 dates
    Par jesus144 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/01/2006, 16h36
  5. Calculer une duree entre 2 dates
    Par d.w.d dans le forum C++
    Réponses: 7
    Dernier message: 02/03/2005, 22h39

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