Вопрос неясен, но похоже, что вы пытаетесь выполнить равенство, которое не возвращает ожидаемые строки, поэтому я предполагаю, что проблема в том, что миллисекунды являются проблематичными. Здесь есть несколько подходов:
- форматировать оба значения (как varchar
и т. д.) с использованием CONVERT: дорого
ЦП, не может использовать индекс
- используйте DATEDIFF / DATEPART для выполнения
математика - похоже, но не вполне как
дорогой
- создать диапазон для поиска между
Третий вариант почти всегда является наиболее эффективным, поскольку он может эффективно использовать индексирование и не требует большой загрузки ЦП.
Например, в приведенном выше примере, поскольку ваша точность равна секундам *, я бы использовал:
DECLARE @end datetime
SET @end = DATEADD(ss,1,@p_date)
затем добавьте ГДЕ формы:
WHERE column_datetime >= @p_date AND column_datetime < @end
Это будет работать лучше всего, если у вас есть кластеризованный индекс для column_datetime, но все равно должно работать, если у вас есть некластеризованный индекс для column_datetime.
[* = если @p_date включает в себя миллисекунды, вам нужно больше думать о том, следует ли обрезать эти мс с помощью DATEADD
или делать меньший диапазон и т. Д.]