|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Développeur informatique Inscription : octobre 2010 Messages : 18 ![]() |
Bonjour à tous,
J'ai besoin de faire la somme d'un Time(7) dans une requête. J'ai essayé avec : SELECT SUM(Act_Duree) AS SommeDuree FROM Temps mais cela ne fonctionne pas, j'ai le message d'erreur : Operand data type time is invalid for sum operator. Comment puis-je faire pour faire la somme ? D'avance merci PS : j'ai également testé ceci : -- SELECT SUM(DATEDIFF(MI,'00:00:00', Act_Duree)) AS SommeDuree, mais cela me renvoie un total faux (il ne prend pas en compte les secondes) |
|
|
00
|
|
|
#2 | |||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Citation:
si vous utilisez TIME(7), soit une précision à 100 ns, et que vous stockez effectivement des durées a cette précision, ou du moins un précision inférieure à la minute, il est normal que le résultat ne soit pas celui attendu, car DATEDIFF renvoi un nombre entier tronqué. ainsi : Code sql :
et par la même : Code sql :
quand bien même 1min59 + 1min59 font 3min58 ceci peut expliquer que le résultat obtenu n'est pas celui attendu... Si c'est la cas, changez le datepart de votre fonction DATEDIFF pour un intervalle plus adapté à vos données, en fonction de leur précision |
|||||
|
|
20
|
|
|
#3 |
![]() ![]() |
Il y a un problème de typage de vos données, non ?
TIME permet de stocker les informations horaires d'une date, ce n'est ni une durée ni un intervalle. Par exemple il est 19h34, c'est bien une information TIME. Mais quelqu'un qui a travaillé pendant 19h, c'est une durée que vous devez stocker dans un format numérique.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#4 | ||||||||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Bonjour,
Je doute également que pour un temps de travail vous ayez besoin d'une précision à 100 nanosecondes ... Vous avez donc utilisé 5 octets au lieu de 3 pour un time(0), pour lequel vous avez une précision à la seconde. Comme vous avez choisi un type de données qui n'est pas destiné à stocker des durées mais une heure, vous pouvez néanmoins extraire le nombre de secondes (mais est-bien la peine ?) qu'une personne a travaillé dans une nouvelle colonne : Code :
Code :
Code :
Enfin pour convertir cette durée stockée en secondes en une valeur plus intelligible, vous pouvez écrire : Code :
Si vous voulez l'utiliser pour dans vos requêtes d'interrogation de la table, il vaut mieux écrire une fonction de table en ligne plutôt qu'une fonction scalaire (meilleur en performances), puisqu'une telle fonction ne retourne qu'une ligne. En effet SQL Server estime toujours qu'une telle fonction retourne une seule ligne Voici donc la fonction de table en ligne : Code :
Code :
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||||||||||
|
00
|
Copyright © 2000-2012 - www.developpez.com