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