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

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

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

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

Любые предложения?

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

' "сравнение" включает гораздо больше, чем равенство "
заставило меня понять, что я не сделал свой вопрос достаточно ясным - я на самом деле просто проверка равенства, то есть все.
4b9b3361

Ответ 1

Наиболее разумный способ сделать это - удалить часть времени из значений даты и времени и сравнить результаты, а лучший способ удалить часть времени из даты и времени выглядит следующим образом:

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 секунд. Это действительно не заботится о части времени там, только границы. В зависимости от того, что пытается сделать ваш запрос, вы можете использовать это в своих интересах.

Ответ 2

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

Ответ 3

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

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

Конечно, "сравнение" включает в себя гораздо больше, чем равенство, и приведенное выше преобразует даты в формат U.S.A MM/DD/YYYY перед проведением сравнения. Таким образом, последствия для производительности и невозможность сравнения различий даты.

Но... он работает.

Ответ 4

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

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

Ответ 5

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

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

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

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