Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso comparar o tempo no SQL Server?


Sua comparação funcionará, mas será lenta porque as datas são convertidas em uma string para cada linha. Para comparar com eficiência duas partes de tempo, tente:
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

Explicação longa:uma data no servidor SQL é armazenada como um número de ponto flutuante. Os dígitos antes do ponto decimal representam a data. Os dígitos após o ponto decimal representam a hora.

Então aqui está um exemplo de data:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'

Vamos convertê-lo para um float:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682

Agora pegue a parte após o caractere vírgula, ou seja, a hora:
set @myfloat = @myfloat - floor(@myfloat) 
select @myfloat
-- Shows 0,824492168212601

Converta de volta para um datetime:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123

O 1900-01-01 é apenas a data "zero"; você pode exibir a parte do tempo com convert, especificando, por exemplo, o formato 108, que é exatamente a hora:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16

As conversões entre datetime e float são bem rápidas, porque são basicamente armazenadas da mesma maneira.