64 votes

Comment puis-je comparer les temps dans SQL Server ?

J'essaie de comparer le temps dans un champ de date dans une requête SQL, mais je ne sais pas si c'est correct. Je ne veux pas comparer la partie date, seulement la partie heure.

C'est ce que je fais :

SELECT timeEvent 
FROM tbEvents 
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)

Est-ce correct ?

Je demande ça parce que j'ai besoin de savoir si 08:00:00 est inférieur ou supérieur à 07:30:00 et je ne veux pas comparer la date, juste la temps partie.

Gracias.

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.

80voto

Andomar Points 115404

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

C'est génial, merci ! J'ai fait beaucoup de conversions varchar, cela semble être une meilleure solution (même si ce n'est pas immédiatement évident en regardant).

19voto

DaDa Points 1904
convert(varchar(5), thedate, 108) between @leftTime and @rightTime

Explication :

si vous avez varchar(5) vous obtiendrez HH:mm

si vous avez varchar(8) vous obtenez HH:mm ss

108 obtient uniquement l'heure à partir de la date SQL

@leftTime y @rightTime sont deux variables à comparer

15voto

Rob Garrison Points 2977

Si vous utilisez SQL Server 2008, vous pouvez le faire :

WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)

Voici un test complet :

DECLARE @tbEvents TABLE (
    timeEvent   int      IDENTITY,
    startHour   datetime
)

INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 0, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 1, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 2, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 3, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 4, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 5, GETDATE())

--SELECT * FROM @tbEvents

DECLARE @startTime  datetime

SET @startTime = DATEADD(mi, 65, GETDATE())

SELECT
    timeEvent,
    CONVERT(time(0), startHour)  AS 'startHour',
    CONVERT(time(0), @startTime) AS '@startTime'
FROM @tbEvents
WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)

4voto

Edgardo Correa Points 11
if (cast('2012-06-20 23:49:14.363' as time) between 
    cast('2012-06-20 23:49:14.363' as time) and 
    cast('2012-06-20 23:49:14.363' as time))

3voto

ronmurp Points 31

L'utilisation du flotteur ne fonctionne pas.

DECLARE @t1 datetime, @t2 datetime
SELECT @t1 = '19000101 23:55:00', @t2 = '20001102 23:55:00'
SELECT CAST(@t1 as float) - floor(CAST(@t1 as float)), CAST(@t2 as float) - floor(CAST(@t2 as float))

Vous verrez que les valeurs ne sont pas les mêmes (SQL Server 2005). Je voulais utiliser cette méthode pour vérifier les heures autour de minuit (la méthode complète a plus de détails) dans laquelle je comparais l'heure actuelle pour être entre 23:55:00 et 00:05:00.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X