2009-11-20 7 views
64

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

Je n'ai pas trouvé de 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 aussi besoin de la partie décimale (donc du type décimal). Donc de 9h00 à 10h30 ça devrait me rapporter 1.5.

Répondre

116

DATEDIFF(hour, start_date, end_date) vous donnera le nombre de limites d'heures croisées entre start_date et end_date.

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

DATEDIFF(second, start_date, end_date)/3600.0 

La documentation DATEDIFF est disponible sur MSDN:

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

+0

Excellente idée. BTW - les mêmes fonctions existent dans .Net aussi, donc c'est utile dans VB.Net ou C#. – Jeff

+0

Pourquoi pas DATEDIFF (MINUTE, date_début, date_fin)/60.0 – irfandar

+4

@irfandar Le 'datepart' passé à' DATEDIFF' contrôlera la résolution de la sortie. Par exemple, si 'start_date' et' end_date' différaient 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). –

-1
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

DateDiff() retourne un entier. Vous pouvez lancer la décimale, mais la mantisse est déjà tronquée. –

+0

Bon à savoir, merci @Joel – kd7

-1

SELECT DATEDIFF (hh, firstdate, secondDate) DE tableName OÙ ...

+0

DateDiff() retourne un int. Vous pouvez lancer la décimale, mais la mantisse est déjà tronquée. –

0

Vous cherchez probablement la fonction DATEDIFF.

DATEDIFF (datepart, startdate, enddate)

Où votre code pourrait ressembler à ceci:

DATEDIFF (hh, startdate, enddate)

+1

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

8

DATEDIFF mais notez qu'il retourne 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 
+1

Downvoter, énoncez votre raison ?? – AnthonyWJones

11

Juste soustraire les deux valeurs datetime et multiplier par 24:

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

un script de test 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 tous 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 le heure) est le nombre de() ticks depuis minuit. (Pour SmallDatetimes, la partie de temps entier est le nombre de minutes écoulées depuis minuit). Toute arithmétique effectuée sur les valeurs utilise la partie temps en fraction de jour. 6h = 0,25, midi = 0,5, etc ... Voir MSDN link here pour plus de détails. Donc Cast ((@ Dt2 - @ Dt1) comme Float) vous donne le nombre total de jours entre deux datetime. Multiplier 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 coche est d'environ 3,33 millisecondes.

+0

Bon tour. SQL devrait inclure une constante nommée. Je me sentais sale en tapant 24, mais je suppose que c'est ce que je reçois pour ne pas être Ronald McDonald. – Allen

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

Ou utiliser pour 2 décimales:

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

S'il vous plaît expliquer votre réponse et comment cela fonctionne. –

Questions connexes