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 :

SUM sur des DATETIME pour calculer durée


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Points : 103
    Points
    103
    Par défaut SUM sur des DATETIME pour calculer durée
    Bonjour à tous,

    Un petit probleme avec les date heure ...

    Tous les jours j'ai des camions qui font des livraisons. Dans ma base de données SQL SERVER j'ai la durée d'une livraison (format DATETIME). J'analyse mes livraisons mensuelle / camion : je fais un SELECT de ma table GROUP BY mon année et mon mois et je voudrais sommer les durées pour avoir la durée des livraisons par camion et par mois.

    J'ai essayé de faire :
    SUM(matable.duree) mais DATETIME n'est pas valide pour l'operateur SUM
    SUM(CONVERT(VARCHAR,matable.duree,108)) mais VARCHAR n'est pas valide pour l'operateur SUM
    SUM(CONVERT(INT,matable.duree,108)) ne genere pas d'erreur mais me donne un resultat bidon (un gros chiffre négatif !)

    Comment puis je sommer des heures pour avoir une durée totale ?
    merci d'avance de votre aide

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Le type de données DATETIME n'est pas vraiment fait pour stocker une durée (différence entre deux dates) mais une date/heure. Si votre colonne DATETIME contient une durée, c'est qu'une astuce à étée utilisée, par exemple, considérer que le début de la livraison est à '01/01/1900 00:00' et enregistrer dans cette colonne '01/01/1900 00:45:00' par exemple si la livraison à duré 45 minutes.
    Difficile d'en dire plus sans savoir, mais une fois le contenu de votre colonne connu, vous pourrez sans doute sommer des différences entre dates (DATEDIFF), ou bien directement une partie de date (DATEPART).

    @+

  3. #3
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Points : 103
    Points
    103
    Par défaut
    Oui c'est exactement le cas : pour une durée de 45 minutes j'ai dans la table 01/01/1900 00:45:00. (de toute façon je ne peux pas changer le format dans la Base de données car je travaille sur une base SQL SERVER de l'ERP NAVISION de Microsoft et je dois réaliser du décisionnel dessus).

    L'utilisation de DATEDIFF permet en effet de calculer une difference entre 2 dates mais mon probleme est bien de calculer la somme de plusieurs durées :

    exemple :
    livraison du lundi 01 : durée 00:45:00
    livraison du mardi 02 : durée 02:50:00
    livraison du mercredi 03 : duréee 08:20:00
    etc ...

    Ma durée totale du mois est bien : 00h 45m 00s + 02h 50m 00s + 08h 20m 00s etc ... et va se traduire à l'arrivée par exemple par 3 jours 5h 20m 00s.
    donc le format DATETIME n'est pas si inaproprié que ça !

    J'ai pensé à l'astuce suivante : peut etre puis je traduire toute mes durées en secondes, sommer mes secondes et reconvertir le resultat final en DATETIME ? mais je n'ai pas trouvé comment convertir un DATETIME en seconde. Connaissez vous l'instruction ?

    D'avance merci de votre interet à mon probleme.

  4. #4
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Il y a sans doute mieux (utiliser la partie décimale de datetime) mais je ferai Heures * 3600 + Minutes * 60 + Secondes en utilisant DATEPART pour obtenir Heures, Minutes et Secondes.

    La partie entière d'un datetime est le nombre de jours écoulés depuis le 1er Janvier 1900

    @+

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous pouvez par exemple écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mesColonnes, SUM(DATEPART(hour, maColonneDate) * 3600) + DATEPART(minute, maColonneDate) * 60 + DATEPART(second, maColonneDate))
    FROM dbo.maTable
    GORUP BY mesColonnes
    @++

  6. #6
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Points : 103
    Points
    103
    Par défaut
    Merci à vous 2, en effet en calculant ainsi ça me donne bien un total en secondes. Je divise le resultat par 3600 pour obtenir une durée totale en heures. ça ira bien comme ça !

    au plaisir ... a+

  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 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Faites un CAST(maDate AS FLOAT) et comme ça vous pouvez faire un SUM dessus. Restrantypez en DATETIME en final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CAST(SUM(CAST(MaDate AS FLOAT)) AS DATETIME)
    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 régulier
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Points : 103
    Points
    103
    Par défaut
    Bonjour,
    merci pour votre intervention mais cela ne fonctionne pas : j'ai le message : Une erreur de depassement arithmetique s'est produite lors de la conversion de expression en type de donnée datetime.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/12/2008, 11h36
  2. Etablir des liens sur des niuméros pour appels automatiques
    Par zerobug dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 17/11/2008, 11h13
  3. petites questions sur des pistes pour un projet
    Par eilijah dans le forum Débuter
    Réponses: 2
    Dernier message: 20/08/2008, 13h20
  4. Utilisation de SUM() sur des 'real'
    Par f.le.chat dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/06/2006, 15h16
  5. [Conception] Requête sur des dates pour stats
    Par vallica dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2006, 10h15

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