Сравните даты в T-SQL, игнорируя временную часть

Я использую MS SQL 2005, и я хочу проверить две даты для равенства, но игнорирую часть времени.

Я знаю, что могу использовать DATEDIFF , но беспокоюсь, что это может быть медленным – этот SP часто используется в БД!

Какие-либо предложения?

Редактировать: комментарий Дэвида Андреса:

«сравнение» включает гораздо больше, чем равенство »

заставило меня понять, что я недостаточно ясно изложил свой вопрос – я на самом деле просто проверяю равенство, вот и все.

Единственный разумный способ сделать это – отделить временную часть значений datetime и сравнить результаты, а лучший способ удалить временную часть из datetime – вот так:

 cast(current_timestamp as date) 

Я использовал и выступал за процесс, который выглядел как одна из двух следующих строк:

 cast(floor(cast(getdate() as float)) as datetime) dateadd(dd,0, datediff(dd,0, getDate())) 

Но теперь, когда Sql Server имеет тип Date , который не содержит компонент времени, нет оснований использовать любой из этих методов.

Еще одна вещь, о которой следует помнить, заключается в том, что это все равно будет искажать запрос, если вам нужно сделать это для двух значений datetime для каждой строки в условии where или условия соединения. Если возможно, вы хотите каким-то образом объяснить это, чтобы он был предварительно рассчитан как можно больше, например, с помощью представления или вычисленного столбца.

Наконец, обратите внимание, что функция DATEDIFF сравнивает количество пересекаемых границ. Таким образом, датированный в дни между '2009-09-14 11:59:59' и '2009-09-15 00:00:01' равен 1, хотя прошло только 2 секунды, но DATEDIFF в дни между '2009-09-15 00:00:01' и '2009-09-15 11:59:59' все равно равен нулю, хотя прошло 86 398 секунд. Обратите внимание, что это не очень важно о временной части. В зависимости от того, что ваш запрос пытается сделать, вы можете использовать это в своих интересах.

WHERE DATEDIFF (день, дата1, дата2) = 0

В моей собственной работе, когда я хотел определить, что две даты были равны независимо от времени суток, я использовал следующее:

 WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

Разумеется, «сравнение» включает в себя гораздо больше, чем равенство, и приведенное выше преобразует даты в формат США MM / DD / YYYY до проведения сравнения. Таким образом, последствия для производительности и невозможность сравнить различия даты.

Но … это действительно работает.

Если один из ваших бизнес-требований не удовлетворен вашей моделью данных (например, у вас есть требование сравнить даты, но вы не отслеживаете даты, а только дату и время), посмотрите на возможность настройки модели, а не метода ее преодоления.

Было бы возможно и полезно хранить дату только в индексированном вычисленном столбце или хранить детали даты и времени отдельно?

Извини за поздний ответ.

Я всегда использую этот синтаксис для сравнения даты

 WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

он всегда отлично работает, когда мы конвертируем дату с кодом формата 112, который возвращает дату в формате yyyyMMdd . он сравнивает дату в формате строки без времени, но отлично работает. благодаря

Давайте будем гением компьютера.