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.
fonte
2009-11-20 14:19:56
Ottima idea. BTW - anche le stesse funzioni esistono in .Net, quindi è utile in VB.Net o C#. – Jeff
Perché non DATEDIFF (MINUTE, start_date, end_date)/60.0 – irfandar
@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). –