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
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
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
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.
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>
.
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
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.