|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : novembre 2010 Messages : 34 ![]() |
Bonjour,
J'essaye de faire un trigger pour calculer une durée entre une date de début et une date de fin: Code :
1900-01-02 15:33:00.000 J'aimerais avoir une durée avec Xjours ou Xheures. Je pense qu'il faut utiliser un DATEDIFF mais je ne m'en sors pas trop avec la syntaxe DECLARE SET... Merci d'avance |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Utilisez un
DATEDIFF(HOUR, DateDebut, DateFin) / 24.0 => ceci vous donnera un nombre de jour décimal (par exemple 2,5 jours, soit 2 jours 12 h). A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : novembre 2010 Messages : 34 ![]() |
Merci
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Cela dit, si j'ai bien compris, votre table contient : - une colonne DateDebut - une colonne DateFin - une colonne Duree Il serait sans doute préférable de définir cette dernière colonne comme colonne calculée, éventuellement persistante. Vous pouvez ainsi vous passer de votre trigger qui, soit dit en passant, recalcule la durée pour toutes les lignes de votre table à chaque insertion. |
|
|
10
|
|
|
#5 |
|
Invité régulier
![]() Inscription : novembre 2010 Messages : 34 ![]() |
Oui c'est juste. Mais comment définit-on une colonne calculée?
|
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Dans votre cas, se serait :
Code SQL :
Le PERSISTED est optionel. S'il est spécifié, le résultat du calcul est stocké au même titre qu'une autre colonne au lieu d’être calculé à la volée lors des requêtes. Cela permet de créer des index portant sur cette colonne. |
||
|
|
10
|
|
|
#7 |
|
Invité régulier
![]() Inscription : novembre 2010 Messages : 34 ![]() |
Merci pour l'info!
|
|
|
00
|
|
|
#8 | ||||||||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Effectivement plusieurs erreurs dans ce trigger, notamment celles qu'a relevé aieeeuuuuu. En outre recalculer la durée de travail lors d'une suppression de ligne n'a plus d'intérêt puisque la ligne n'est plus là. Cela donnerait dont le trigger suivant : Code :
- d'un INSERT, n'est accessible que la table virtuelle inserted qui expose les valeurs des lignes qui viennent d'être ajoutées - d'un UPDATE, sont accessibles les deux tables virtuelles inserted et deleted, qui respectivement exposent les anciennes et nouvelles valeurs pour toutes les lignes affectées par l'UPDATE - d'un DELETE, n'est accessible que la table virtuelle deleted qui expose les valeurs des lignes qui viennent d'être supprimées. La fonction UPDATE() permet de vérifier si une colonne a été mise à jour. Dans le cas d'un UPDATE d'autres colonnes de la table MaTable que DateDebut et DateFin, il n'y a pas besoin de recalculer l'intervalle. Mais comme l'a suggéré aieeeuuuuu, le mieux est d'utiliser une colonne calculée, ou encore de faire une vue. Tout dépend si vous avez des requêtes qui vont filtrer sur la colonne DureeTravail. Si c'est le cas, le mieux est de faire une colonne calculée : Code :
Code :
Code :
Maintenant s'il s'agit simplement d'afficher la durée de travail, et que vous ne filtrez pas dessus : - soit vous faites la colonne calculée (1er script), et vous interrogez la table - soit vous implémentez la vue suivante, qui s'interroge comme une table : 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 |
||||||||||||
|
10
|
|
|
#9 |
|
Invité régulier
![]() Inscription : novembre 2010 Messages : 34 ![]() |
Merci beaucoup pour les conseils elsuket
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com