Лучший способ сравнить даты без времени в 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 на сервере
- Пользователи против этих данных относятся к разному часовому поясу
Ответы
Ответ 1
Не используйте конвертировать - это включает строки без причины. Хитрость заключается в том, что 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
Ответ 2
Простое преобразование в 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
Ответ 3
SELECT .......
FROM ........
WHERE
CAST(@DATETIMEVALUE1 as DATE) = CAST(@DATETIMEVALUE2 as DATE)
Недостаток заключается в том, что вы создаете столбец фильтра.
Если в столбце фильтра есть индекс, то, поскольку вы выполняете кастинг, механизм SQL больше не может использовать индексы для более эффективного фильтрации даты.
Ответ 4
Описание
Не конвертируйте свою дату в varchar и сравните, потому что сравнение строк не быстро.
Это намного быстрее, если вы используете >=
и <
для фильтрации столбца DateCreated
.
Если у вас нет параметров (например, в вашем примере, строке), вы должны использовать формат 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
Дополнительная информация
Ответ 5
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
Я пытался сделать это как можно точнее, извините за недостающие комментарии. Не стесняйтесь запускать тесты, чтобы проверить общие результаты.
Ответ 6
Используйте формат 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))
Ответ 7
объявлять @DateToday Date = '2019-10-1';
print @DateToday;
напечатать Abs (дата (день, @DateToday, CAST (октябрь 1 2019 7: 00: 00PM 'в качестве даты))) & lt; 3
это сравнительно 3 дня.
Я проверяю это на SQL Server 2014, он работает.
Ответ 8
select * from sampleTable
where date_created ='20120215'
Это также сравнит ваш столбец с конкретной датой
без учета времени