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!
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!
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.
et les vues alors, à quoi serviraient-elles ?
1) une fonction (UDF) pour ce faire :
Une vue avec : dbo.F_CONVERT_S_HMS(DATEDIFF(second, datedebut, datefin))
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
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/ * * * * *
Bonjour,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) ?
DATEDIFF(second, DateDebut, DateFin) va renvoyer le nombre de secondes.
- DATEDIFF(second, DateDebut, DateFin) / 3600 va renvoyer le nombre d'heures,
- (DATEDIFF(second, DateDebut, DateFin) % 3600) / 60 va renvoyer le nombre de minutes restantes,
- DATEDIFF(second, DateDebut, DateFin) % 60 va renvoyer le nombre de secondes restantes.
Il suffit d'assembler le tout correctement...
Philippe.
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.
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 !
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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager