tuo confrontare funzionerà, ma sarà lenta a causa le date vengono convertite in una stringa per ogni riga. Per confrontare in modo efficace due parti di tempo, provare:
declare @first datetime
set @first = '2009-04-30 19:47:16.123'
declare @second datetime
set @second = '2009-04-10 19:47:16.123'
select (cast(@first as float) - floor(cast(@first as float))) -
(cast(@second as float) - floor(cast(@second as float)))
as Difference
lunga spiegazione: una data in SQL Server viene memorizzato come un numero in virgola mobile. Le cifre prima del punto decimale rappresentano la data. Le cifre dopo il punto decimale rappresentano l'ora.
Quindi, ecco una data di esempio:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Facciamo convertirlo in un float:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Ora prendete la parte dopo la cifra, cioè il tempo:
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Converti nuovamente in un datetime:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
Il 1900-01-01 è solo la data "zero"; è possibile visualizzare la parte di tempo con convert, specificando ad esempio formato di 108, che è solo il tempo:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
conversioni tra datetime e galleggiante sono abbastanza veloce, perché sono fondamentalmente memorizzati nello stesso modo.
Perché devo convertire in VARCHAR in modo da poter confrontare se un tempo è maggiore rispetto agli altri? Non potrei in questo modo confrontare le stringhe con le stringhe ?? – AndreMiranda
La funzione DateDiff accetta i campi datetime come input, in modo che tu possa superare la gobba. – Eric