2009-11-20 15 views
64

Devo calcolare la differenza in ore (tipo decimale) tra due date in SQL Server 2008.Come calcolare la differenza in ore (decimale) tra due date in SQL Server?

Non sono riuscito a trovare alcuna tecnica utile per convertire datetime in decimale con "CONVERT" su MSDN.
Qualcuno può aiutarmi con quello?

UPDATE:
Per essere chiari, ho bisogno anche della parte frazionaria (quindi del tipo decimale). Quindi dalle 9:00 alle 10:30 dovrebbe restituirmi 1.5.

risposta

116

DATEDIFF(hour, start_date, end_date) ti darà il numero di limiti orari attraversati tra start_date e end_date.

Se è necessario il numero di ore frazionali, è possibile utilizzare DATEDIFF a una risoluzione maggiore e dividere il risultato:

DATEDIFF(second, start_date, end_date)/3600.0 

La documentazione per DATEDIFF è disponibile su MSDN:

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

+0

Ottima idea. BTW - anche le stesse funzioni esistono in .Net, quindi è utile in VB.Net o C#. – Jeff

+0

Perché non DATEDIFF (MINUTE, start_date, end_date)/60.0 – irfandar

+4

@irfandar Il 'datepart' passato a' DATEDIFF' controllerà la risoluzione dell'output. Ad esempio, se 'start_date' e' end_date' differiscono di 59 secondi, quindi 'DATEDIFF (MINUTE, start_date, end_date)/60.0' restituirebbe 0, ma' DATEDIFF (second, start_date, end_date)/3600.0' restituirebbe 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 

Risultato = 1.00

+1

DateDiff() restituisce un int. Puoi eseguire il cast in decimale, ma ha già troncato la mantissa. –

+0

Buono a sapersi, grazie @Joel – kd7

-1

SELEZIONA DATEDIFF (hh, firstDate, secondDate) FROM nometabella DOVE ...

+0

DateDiff() restituisce un int. Puoi eseguire il cast in decimale, ma ha già troncato la mantissa. –

0

Probabilmente si sta cercando per la funzione DATEDIFF.

DATEDIFF (datepart, startdate, enddate)

Dove si codice potrebbe essere simile a questo:

DATEDIFF (hh, startdate, enddate)

+1

L'intervallo 'hh' non farà ciò che vuole. Ha bisogno di un intervallo più piccolo in modo da poter calcolare le ore frazionarie. –

8

DATEDIFF ma è da notare che restituisce un numero intero, quindi se hai bisogno di frazioni di ore usa qualcosa del genere: -

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

Downvoter, indica la tua ragione ?? – AnthonyWJones

11

Basta sottrarre i due valori datetime e moltiplicare per 24:

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

uno script di test potrebbe essere:

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 

Questo funziona perché tutti datetimes sono memorizzati internamente come una coppia di numeri interi, il primo intero è il numero di giorni dal 1 gen 1900 e il secondo numero intero (che rappresenta la orario) è il numero di() ticks da mezzanotte. (Per SmallDatetimes il numero intero di tempo è il numero di minuti dalla mezzanotte). Qualsiasi operazione aritmetica sui valori utilizza la porzione del tempo come frazione di un giorno. 6am = 0,25, mezzogiorno = 0,5, ecc ... Vedi MSDN link here per maggiori dettagli.

Quindi, Cast ((@ Dt2 - @ Dt1) come Float) consente di ottenere giorni totali compresi tra due datazioni. Moltiplicare per 24 per convertire in ore.Se avete bisogno di minuti totali, Multiplo di minuti al giorno (24 * 60 = 1440) invece di 24 ...

NOTA 1: Questa non è la stessa cosa di un dotNet o JavaScript tick - questo tick è di circa 3.33 millisecondi.

+0

Bel trucco. SQL dovrebbe includere una costante denominata. Mi sono sentito sporco quando ho digitato 24, ma immagino sia quello che ottengo per non essere Ronald McDonald. – Allen

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

Oppure utilizzare questo per 2 cifre decimali:

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

Spiega la tua risposta e come funziona. –

Problemi correlati