#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 ))