Лучший способ сравнить даты без времени в 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)

Я хочу сравнить даты без времени

выше запрос в порядке? или другое лучшее решение, которое вы предлагаете

  • Я использую SQL Server 2005
  • дата в формате UTC на сервере
  • пользователи против этих данных принадлежит другой часовой пояс

7 ответов


Не используйте convert-это включает строки без причины. Фокус в том, что datetime на самом деле является числовым, а days-целочисленной частью (time-десятичная дробь); следовательно, день -пол значения: это тогда просто математика, а не строки-намного быстрее

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

в вашем случае нет необходимости конвертировать обратно в datetime; и использование диапазона позволяет наиболее эффективные сравнения (особенно если индексируется):

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

простой бросок в Date решит проблему.

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

описание

Не преобразуйте дату в varchar и сравните, потому что string comparisson не быстрый.

это намного быстрее, если вы используете >= и < фильтрация .

если у вас нет параметра (как в вашем примере строка), вы должны использовать формат ISO <Year><Month><Day>.

пример

согласно вашему образцу

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 ........
WHERE 
CAST(@DATETIMEVALUE1 as DATE) = CAST(@DATETIMEVALUE2 as DATE)

недостатком является то, что вы отбрасываете столбец фильтра.

Если в столбце фильтра есть индекс, то, поскольку вы выполняете кастинг, SQL engine больше не может использовать индексы для более эффективной фильтрации даты.


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

после выполнения тестирования наиболее очевидных решений, вот мой результат:

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

результат:

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

Я попытался сделать это как можно точнее, извините за отсутствующие комментарии. Не стесняйтесь запускать тесты, чтобы проверить общие результаты.


используйте формат 112 CONVERT

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

или

Если ваша версия sql server 2008 + использует DATE тип

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

select * from sampleTable 
where date_created ='20120215'

Это также сравнит ваш столбец с конкретной датой без учета времени