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


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

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

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

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

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

5 ответов:

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

где DATEDIFF(day, date1, date2)=0

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

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

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

But...it действительно работает.

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

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

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

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

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

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