Подтвердить что ты не робот

Лучший способ сравнить даты без времени в 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 на сервере
  • Пользователи против этих данных относятся к разному часовому поясу
4b9b3361

Ответ 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'

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