Сравните даты в T-SQL, игнорируя часть времени
Я использую MS SQL 2005, и я хочу проверить две даты на равенство, но игнорируя часть времени.
Я знаю, что могу использовать DATEDIFF, но я обеспокоен тем, что он может быть медленным - этот SP часто используется в БД!
какие предложения?
Edit: Дэвид Андрес комментарий:
'"сравнение" включает в себя гораздо больше, чем равенство'заставил меня понять, что я не сделал мой вопрос достаточно ясно - я на самом деле просто проверка на равенство, вот и все.
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 секунды. Обратите внимание, что это действительно не заботится о части времени там. В зависимости от того, что ваш запрос пытается сделать, вы можете использовать это в своих интересах.
в моей собственной работе, когда я хотел определить, что две даты были равны независимо от времени суток, я использовал следующее:
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 он возвращает дату в . он сравнивает дату в строковом формате без времени, но отлично работает. спасибо