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