Хотя я проголосовал за ответ, помеченный как правильный. Я хотел бы коснуться нескольких вещей для любого, кто наткнулся на это.
В общем, если вы фильтруете только по значениям Дата . Microsoft рекомендует использовать не зависящий от языка формат ymd
или y-m-d
.
Обратите внимание, что форма '2007-02-12' считается не зависящей от языка
для типов данных DATE, DATETIME2 и DATETIMEOFFSET.
Провести сравнение дат с использованием вышеупомянутого подхода просто. Рассмотрим следующий надуманный пример.
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
В идеальном мире следует избегать любых манипуляций с отфильтрованным столбцом, поскольку это может помешать SQL Server эффективно использовать индексы. Тем не менее, если данные, которые вы храните, касаются только даты, а не времени, рассмотрите возможность хранения как DATETIME
с полночью как временем. Потому что:
Когда SQL Server преобразует литерал в тип фильтруемого столбца, он
предполагает полночь, когда часть времени не указана. Если вы хотите такой
Фильтр для возврата всех строк с указанной даты, необходимо убедиться,
что вы сохраняете все значения с полночью как временем.
Таким образом, предполагая, что вас интересует только дата, и сохраняйте свои данные как таковые. Приведенный выше запрос может быть упрощен до:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate