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 trouvé aucune technique utile pour convertir datetime en décimal avec 'CONVERT' sur MSDN.
Quelqu'un peut m'aider avec ça?

Mise à jour:
Pour être clair, j'ai aussi besoin de la partie fractionnaire (donc de type décimal). Donc, de 9h00 à 10h30, il devrait me retourner 1,5.

68
demandé sur Marc 2009-11-20 17:01:17

8 réponses

DATEDIFF(hour, start_date, end_date) vous donnera le nombre d'heure frontières 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

127
répondu Phil Ross 2015-07-15 23:03:15

Soustrayez simplement les deux valeurs datetime et multipliez-les 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 datetimes sont stockées en interne comme une paire d'entiers, le premier entier est le nombre de jours depuis le 1er janvier 1900, et le second entier (représentant l'heure) est le nombre de (1) tiques depuis minuit. (Pour SmallDatetimes, l'entier de partie de temps est le nombre de minutes depuis minuit). Toute arithmétique faite sur le valeurs utilise la partie de temps comme une fraction d'un jour. 6h = 0.25, midi = 0.5, etc... Voir le lien MSDN ici pour plus de détails.

Donc Cast ((@DT2 - @DT1) en tant que Float) vous donne le nombre total de jours entre deux datetimes. Multipliez par 24 pour convertir en heures. Si vous avez besoin de minutes totales, Multiple par Minutes par jour (24 * 60 = 1440) au lieu de 24...

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

13
répondu Charles Bretana 2016-02-16 15:39:06

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
8
répondu AnthonyWJones 2009-11-20 14:09:51

Vous recherchez probablement la fonctionDATEDIFF .

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

Où le code pourrait ressembler à ceci:

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

0
répondu Vincent Ramdhanie 2009-11-20 14:07:37
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
répondu mind 2017-11-29 09:49:18

En utilisant Postgres j'ai eu des problèmes avec DATEDIFF, mais j'ai réussi 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"

0
répondu Patrick Kearns 2018-04-11 21:12:47
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
répondu kd7 2009-11-20 14:05:51

Sélectionnez DATEDIFF(hh, firstDate, secondDate) From tableName OÙ ...

-1
répondu LorettoDave 2009-11-20 14:06:00