Сравните даты в T-SQL, игнорируя часть времени - PullRequest
59 голосов
/ 15 сентября 2009

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

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

Есть предложения?

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

«Сравнение» включает в себя гораздо больше, чем равенство »
заставил меня осознать, что я не прояснил свой вопрос достаточно четко - я на самом деле просто проверка на равенство, вот и все.

Ответы [ 5 ]

89 голосов
/ 15 сентября 2009

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

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

37 голосов
/ 14 октября 2012

ГДЕ DATEDIFF (день, дата1, дата2) = 0

7 голосов
/ 15 сентября 2009

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

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

Конечно, «сравнение» включает в себя гораздо больше, чем равенствои выше преобразует даты в формат США ММ / ДД / ГГГГ перед сравнением.Таким образом, последствия для производительности и неспособность сравнить различия в датах.

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

4 голосов
/ 15 сентября 2009

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

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

3 голосов
/ 26 июля 2013

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...