web-dev-qa-db-fra.com

Meilleure façon de comparer des dates sans heure dans SQL Server

select * from sampleTable 
where CONVERT(VARCHAR(20),DateCreated,101) 
=     CONVERT(VARCHAR(20),CAST('Feb 15 2012  7:00:00:000PM' AS DATETIME),101)

Je veux comparer la date sans l'heure

La requête ci-dessus est-elle correcte? ou autre meilleure solution que vous proposez

  • J'utilise SQL Server 2005
  • Date enregistrée au format UTC sur le serveur
  • Les utilisateurs de ces données appartiennent à un fuseau horaire différent
19
Ali

N'utilisez pas convert - cela implique des chaînes sans raison. Une astuce est qu'un datetime est en fait un numérique, et les jours est la partie entière (le temps est la fraction décimale); d'où le jour est le ÉTAGE de la valeur: ce n'est alors que des mathématiques, pas des chaînes - beaucoup plus rapide

declare @when datetime = GETUTCDATE()
select @when -- date + time
declare @day datetime = CAST(FLOOR(CAST(@when as float)) as datetime)
select @day -- date only

Dans votre cas, pas besoin de reconvertir en datetime; et l'utilisation d'une plage permet les comparaisons les plus efficaces (surtout si elles sont indexées):

declare @when datetime = 'Feb 15 2012  7:00:00:000PM'
declare @min datetime = FLOOR(CAST(@when as float))
declare @max datetime = DATEADD(day, 1, @min)

select * from sampleTable where DateCreated >= @min and DateCreated < @max
26
Marc Gravell

La conversion simple en Date résoudra le problème.

DECLARE @Date datetime = '04/01/2016 12:01:31'

DECLARE @Date2 datetime = '04/01/2016'

SELECT CAST(@Date as date)

SELECT CASE When (CAST(@Date as date) = CAST(@Date2 as date)) Then 1 Else 0 End
17
SubhoM
SELECT .......
FROM ........
WHERE 
CAST(@DATETIMEVALUE1 as DATE) = CAST(@DATETIMEVALUE2 as DATE)

L'inconvénient est que vous transtypez la colonne de filtre.

S'il y a un index sur la colonne de filtre, alors, puisque vous effectuez un cast, le moteur SQL ne peut plus utiliser d'index pour filtrer la date plus efficacement.

5
user3957458

La description

Ne convertissez pas votre date en varchar et ne comparez pas car la comparaison des chaînes n'est pas rapide.

C'est beaucoup plus rapide si vous utilisez >= et < pour filtrer votre colonne DateCreated.

Si vous n'avez pas de paramètre (comme dans votre exemple, une chaîne), vous devez utiliser le format ISO <Year><Month><Day>.

Échantillon

Selon votre échantillon

DECLARE @startDate DateTime
DECLARE @endDate DateTime

SET @startDate = '20120215'
SET @endDate = DATEADD(d,1,@startDate)

SELECT * FROM sampleTable 
WHERE DateCreated >= @startDate AND DateCreated < @endDate

Plus d'information

4
dknaack
SELECT * from sampleTable  
WHERE 
datediff(day, DateCreated,CAST('Feb 15 2012  7:00:00:000PM' AS DATETIME))  = 0    

Après avoir testé les performances des solutions les plus évidentes, voici mon résultat:

declare @mytime int, @othertime int, @othertime2 int
declare @i int = 0
declare @dummy int
declare @emptyloop int
declare @time datetime = getdate()

while @i < 100000
begin
set @i = @i + 1
end
set @emptyloop = datediff(microsecond, @time, getdate())

set @time = getdate()

set @i = 0
while @i < 100000
begin
select @dummy = 1 WHERE datediff(day, 0,getdate())  = 0
set @i = @i + 1
end
select @othertime = datediff(microsecond, @time, getdate()) - @emptyloop

set @time = getdate()

set @i = 0
while @i < 100000
begin
select @dummy = 1 WHERE datediff(day, 0,@i)  = 0
set @i = @i + 1
end
set @mytime = datediff(microsecond, @time, getdate()) - @emptyloop


declare @when datetime = 'Feb 15 2012  7:00:00:000PM' 
declare @min datetime = FLOOR(CAST(@when as float)) 
declare @max datetime = DATEADD(day, 1, @min)  
set @time = getdate()
set @i = 0
while @i < 100000
begin
select @dummy = 1 WHERE @i >= @min and @i < @max
set @i = @i + 1
end
set @othertime2 = datediff(microsecond, @time, getdate()) - @emptyloop


select @mytime mytime, @othertime othertime, @othertime2 othertime2

Résultat:

mytime      othertime   othertime2
----------- ----------- -----------
117000      144000      147000

J'ai essayé de le faire aussi exactement que possible, désolé pour les commentaires manquants. N'hésitez pas à exécuter les tests pour vérifier les résultats globaux.

1
t-clausen.dk