Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je comparer le temps dans SQL Server ?

Votre comparaison fonctionnera, mais elle sera lente car les dates sont converties en une chaîne pour chaque ligne. Pour comparer efficacement deux tranches horaires, essayez :

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

Explication longue :une date dans le serveur SQL est stockée sous la forme d'un nombre à virgule flottante. Les chiffres avant la virgule représentent la date. Les chiffres après la virgule représentent l'heure.

Voici donc un exemple de date :

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

Convertissons-le en flottant :

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

Prenez maintenant la partie après le caractère virgule, c'est-à-dire l'heure :

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

Reconvertissez-le en date/heure :

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

Le 1900-01-01 n'est que la date "zéro" ; vous pouvez afficher la partie heure avec convert, en spécifiant par exemple le format 108, qui est juste l'heure :

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

Les conversions entre datetime et float sont assez rapides, car elles sont essentiellement stockées de la même manière.