94 votes

Comment calculer la différence en heures (décimales) entre deux dates dans SQL Server ?

Je dois calculer la différence en heures (type décimal) entre deux dates dans SQL Server 2008.

Je n'ai pas trouvé de technique utile pour convertir une date en décimal avec 'CONVERT' sur MSDN.
Quelqu'un peut-il m'aider ?

UPDATE :
Pour être clair, j'ai également besoin de la partie fractionnaire (donc de type décimal). Ainsi, de 9h00 à 10h30, il devrait me renvoyer 1,5.

177voto

Phil Ross Points 10227

DATEDIFF(hour, start_date, end_date) vous donnera le nombre de frontières horaires franchies entre start_date y end_date .

Si vous avez besoin du nombre d'heures fractionnaires, vous pouvez utiliser DATEDIFF à une résolution plus élevée et diviser le résultat :

DATEDIFF(second, start_date, end_date) / 3600.0

La documentation pour DATEDIFF est disponible sur MSDN :

http://msdn.microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx

0 votes

Excellente idée. D'ailleurs, les mêmes fonctions existent aussi en .Net, ce qui rend l'idée utile en VB.Net ou en C#.

2 votes

Pourquoi pas DATEDIFF(MINUTE, start_date, end_date) / 60.0

10 votes

@irfandar Le datepart transmis à DATEDIFF contrôlera la résolution de la sortie. Par exemple, si start_date y end_date diffèrent de 59 secondes, alors DATEDIFF(MINUTE, start_date, end_date) / 60.0 retournerait 0, mais DATEDIFF(second, start_date, end_date) / 3600.0 retournerait 0.0163888 (59/3600).

17voto

Charles Bretana Points 59899

Il suffit de soustraire les deux valeurs de date et de les multiplier par 24 :

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0

un test script pourrait être :

  Declare @Dt1 dateTime Set @Dt1 = '12 Jan 2009 11:34:12'
  Declare @Dt2 dateTime Set @Dt2 = getdate()

  Select Cast((@Dt2 - @Dt1) as Float) * 24.0

Cela fonctionne parce que toutes les dates sont stockées en interne sous la forme d'une paire d'entiers, le premier entier étant le nombre de jours depuis le 1er janvier 1900, et le second entier (représentant l'heure) étant le nombre de ( 1 ) tiques depuis minuit. (Pour les SmallDatetimes, l'entier de la partie temps est le nombre de minutes depuis minuit). Toute arithmétique effectuée sur les valeurs utilise la portion de temps comme une fraction de jour. 6h du matin = 0,25, midi = 0,5, etc... Voir Lien MSDN ici pour plus de détails.

Ainsi, Cast((@Dt2 - @Dt1) as Float) vous donne le nombre total de jours entre deux dates. Multipliez par 24 pour convertir en heures. Si vous avez besoin du total des minutes, multipliez par Minutes par jour (24 * 60 = 1440) au lieu de 24...

NOTE 1 : Ce n'est pas la même chose qu'un tick dotNet ou javaScript - ce tick est d'environ 3,33 millisecondes.

0 votes

Belle astuce. Le SQL devrait inclure une constante nommée. Je me sentais sale en tapant 24, mais je suppose que c'est ce qui arrive quand on n'est pas Ronald McDonald.

10voto

AnthonyWJones Points 122520

DATEDIFF mais notez qu'il retourne un nombre entier donc si vous avez besoin de fractions d'heures, utilisez quelque chose comme ceci :-.

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600

0voto

Vincent Ramdhanie Points 46265

Vous recherchez probablement le DATEDIFF fonction.

DATEDIFF ( datepart , startdate , enddate )

L'endroit où vous codez pourrait ressembler à ceci :

DATEDIFF ( hh , startdate , enddate )

1 votes

L'intervalle 'hh' ne fera pas ce qu'il veut. Il a besoin d'un intervalle plus petit pour pouvoir calculer des fractions d'heures.

0voto

kd7 Points 16740
Declare @date1 datetime
Declare @date2 datetime

Set @date1 = '11/20/2009 11:00:00 AM'
Set @date2 = '11/20/2009 12:00:00 PM'

Select Cast(DateDiff(hh, @date1, @date2) as decimal(3,2)) as HoursApart

Résultat = 1.00

1 votes

DateDiff() retourne un int. Vous pourriez le convertir en décimal, mais la mantisse serait déjà tronquée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X