Как выполнить поиск даты и времени в Sql server 2008R2

#sql #sql-server #datetime

#sql #sql-сервер #дата и время

Вопрос:

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

 where registration_date = '2014-06-19 00:12:08.940' 
 

это работает, но как только я попытаюсь выполнить поиск с помощью

 where registration_date like '2014-06-19%' 
 

я не получаю результатов. поскольку я хочу выполнить поиск по всем регистрациям, выполненным в определенную дату, включая время, я предполагаю, что я не знаю конкретного времени…

Комментарии:

1. registration_date >= '2014-06-19' AND registration_date < '2014-06-20'

Ответ №1:

Просто найдите все, что относится, по крайней мере, к этой дате или после нее, и раньше, чем на следующий день.

     registration_date >= '2014-06-19'
AND registration_date < '2014-06-20'
 

Ответ №2:

Вам нужно будет привести к дате, чтобы сравнить две даты на равенство. например

 CAST(registration_date AS DATE) = CAST('2014-06-19' AS DATE)
 

Альтернатива:

 DECLARE @DateToFilter DATE = (CAST('2014-06-19' AS DATE))    
[..]
WHERE registration_date >= @DateToFilter
AND registration_date < DATEADD(d, 1, @DateToFilter)
 

Редактировать:
Что касается производительности и предположения, что в столбце даты существует индекс, индекс можно использовать в обоих случаях (да, ПРИВЕДЕНИЕ (x КАК ДАТА) является допустимым). Здесь и здесь приведен очень интересный анализ различий в производительности. Как всегда, проверка.

Комментарии:

1. @g2server спасибо (cast) выполнил задание, но еще один вопрос, как я могу добавить «между» в ваш приведенный выше запрос, не могли бы вы изменить его на «между»

2. Избегайте CAST указания диапазона, если у вас есть индекс на registration_date SQL Server, который может эффективно искать в этом диапазоне.

Ответ №3:

Поиск с интервалами:

 WHERE registration_date >= '2014-06-19 00:00:00' AND registration_date < '2014-06-20 00:00:00'
 

При поиске определенного времени используйте одно и то же значение в обоих условиях, при поиске дня используйте приведенный выше формат.

Ответ №4:

Попробуйте это

 where convert(date,registration_date) = '2014-06-19' 
 

Это работает и для between

Ответ №5:

Каждый раз, когда вы разыгрываете обе части, все данные с одинаковой датой находят как

 CAST(registration_date AS DATE) = CAST('2014-06-19' AS DATE)
or 
Convert(varchar(10), registration_date,103) = Convert(varchar(10),'2014-06-19' ,103)
 

или вы можете выполнить поиск в указанном выше диапазоне дат

  registration_date 
 between cast( getdate() as date ) and
 dateadd(dd, 1, cast( getdate() as date ))