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.
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
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.
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
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 )
DATEDIFF(minute,startdate,enddate)/60.0)
Ou utilisez ceci pour 2 décimales:
CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))
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"
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
Sélectionnez DATEDIFF(hh, firstDate, secondDate) From tableName OÙ ...