Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso confrontare il tempo in SQL Server?

Il tuo confronto funzionerà, ma sarà lento perché le date vengono convertite in una stringa per ogni riga. Per confrontare in modo efficiente due parti temporali, prova:

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

Spiegazione lunga:una data nel server SQL viene memorizzata come numero in virgola mobile. Le cifre prima del punto decimale rappresentano la data. Le cifre dopo la virgola rappresentano l'ora.

Quindi ecco una data di esempio:

declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'

Convertiamolo in float:

declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682

Ora prendi la parte dopo il carattere virgola, ovvero l'ora:

set @myfloat = @myfloat - floor(@myfloat) 
select @myfloat
-- Shows 0,824492168212601

Convertilo in una data e ora:

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"; puoi visualizzare la parte temporale con convert, specificando ad esempio il formato 108, che è proprio l'ora:

select convert(varchar(32),@mytime,108)
-- Shows 19:47:16

Le conversioni tra datetime e float sono piuttosto veloci, perché sostanzialmente vengono archiviate allo stesso modo.