Votre comparaison fonctionnera, mais elle sera lente car les dates sont converties en chaîne de caractères pour chaque ligne. Pour comparer efficacement deux parties de temps, 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
Longue explication : une date dans le serveur SQL est stockée comme un nombre à virgule flottante. Les chiffres avant le point décimal 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
Maintenant, prenez la partie après le caractère virgule, c'est-à-dire l'heure :
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Le reconvertir en date :
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
Le 1900-01-01 est juste 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 les dates et les valeurs flottantes sont assez rapides, car elles sont stockées de la même manière.
0 votes
Pourquoi dois-je convertir en VARCHAR pour pouvoir comparer si un temps est plus grand que l'autre ? Ne pourrais-je pas ainsi comparer une chaîne de caractères avec une autre chaîne de caractères ?
0 votes
La fonction DateDiff accepte les champs de type datetime en entrée, ce qui vous permettra de passer le cap.