web-dev-qa-db-fra.com

Comment calculer la différence en heures (décimal) 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 trouvé aucune technique utile pour convertir datetime en décimal avec 'CONVERT' sur MSDN.
Quelqu'un peut-il m'aider avec ça?

MISE À JOUR:
Pour être clair, j'ai également besoin de la partie décimale (donc du type décimal). Donc, de 9h00 à 10h30, il devrait me rendre 1,5.

75
Marc

DATEDIFF(hour, start_date, end_date) vous indiquera le nombre d'heures franchies entre start_date et 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 de DATEDIFF est disponible sur MSDN:

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

146
Phil Ross

Soustrayez simplement les deux valeurs datetime et multipliez par 24:

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

un script de test peut ê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 est le nombre de jours depuis le 1 er janvier 1900 et le second entier (représentant l'heure) est le nombre de ( 1 ) ticks depuis Minuit. (Pour SmallDatetimes, l'entier de la partie heure correspond au nombre de minutes écoulées depuis minuit). Toute arithmétique effectuée sur les valeurs utilise la partie heure comme fraction de jour. 6 heures = 0,25, midi = 0,5, etc ... Voir lien MSDN ici pour plus de détails.

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

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

14
Charles Bretana

DATEDIFF mais notez qu'il renvoie un 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
9
AnthonyWJones

En utilisant Postgres, j'ai eu des problèmes avec DATEDIFF, mais j'ai eu du succès avec ceci:

  DATE_PART('day',(delivery_time)::timestamp - (placed_time)::timestamp) * 24 + 
  DATE_PART('hour',(delivery_time)::timestamp - (placed_time)::timestamp) +
  DATE_PART('minute',(delivery_time)::timestamp - (placed_time)::timestamp) / 60

qui m'a donné une sortie comme "14.3"

2
Patrick Kearns
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

0
kd7

Vous êtes probablement à la recherche de la fonction DATIFF .

DATEDIFF (datepart, startdate, enddate)

Où votre code pourrait ressembler à ceci:

DATEDIFF (hh, date de début, date de fin)

0
Vincent Ramdhanie
DATEDIFF(minute,startdate,enddate)/60.0)

Ou utilisez ceci pour 2 décimales:

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))
0
mind