sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo comparar el tiempo en SQL Server?

Su comparación funcionará, pero será lenta porque las fechas se convierten en una cadena para cada fila. Para comparar eficientemente dos partes de tiempo, intente:

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

Explicación larga:una fecha en el servidor SQL se almacena como un número de coma flotante. Los dígitos antes del punto decimal representan la fecha. Los dígitos después del punto decimal representan la hora.

Así que aquí hay una fecha de ejemplo:

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

Vamos a convertirlo en un flotador:

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

Ahora tome la parte después del carácter de coma, es decir, el tiempo:

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

Conviértalo de nuevo a una fecha y hora:

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

El 1900-01-01 es solo la fecha "cero"; puede mostrar la parte de tiempo con convert, especificando por ejemplo el formato 108, que es solo el tiempo:

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

Las conversiones entre datetime y float son bastante rápidas, porque básicamente se almacenan de la misma manera.