Сравните DATETIME и DATE, игнорируя временную часть

У меня две таблицы, где column [date] – тип DATETIME2(0) .

Мне приходится сравнивать две записи только по их части Date (день + месяц + год), отбрасывая временные части (часы + минуты + секунды).

Как я могу это сделать?

Используйте CAST для нового типа данных DATE в SQL Server 2008, чтобы сравнить только часть даты:

 IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE) 

Небольшой недостаток ответа Марка заключается в том, что оба поля даты были typecast, то есть вы не сможете использовать любые индексы.

Поэтому, если есть необходимость написать запрос, который может извлечь выгоду из индекса в поле даты, тогда необходим следующий (довольно запутанный) подход.

  • Индексированное поле даты (называть его DF1) должно быть не затронуто какой бы то ни было функцией.
  • Поэтому вам нужно сравнить DF1 с полным диапазоном значений даты и времени в день DF2.
  • То есть с даты-части DF2, до даты-части дня после DF2.
  • Ie (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • ПРИМЕЧАНИЕ . Очень важно, чтобы сравнение было > = (разрешено равенство) до даты DF2 и (строго) < на следующий день после DF2. Кроме того, оператор BETWEEN не работает, поскольку он допускает равенство с обеих сторон.

PS: Еще одно средство для извлечения только даты (в старых версиях SQL Server) заключается в том, чтобы использовать трюк о том, как дата представляется внутри.

  • Введите дату как поплавок.
  • Усечь дробную часть
  • Верните значение в datetime
  • Т.е. CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

Хотя я подтвердил ответ, обозначенный как правильный. Я хотел затронуть несколько вещей для тех, кто наткнулся на это.

В общем, если вы конкретно фильтруете только значения Date . Корпорация Майкрософт рекомендует использовать нейтральный формат языка ymd или ymd .

Обратите внимание, что форма ‘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 

Вы можете попробовать это

 CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') 

Я тестирую, что для MS SQL 2014 по следующему коду

 select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok' else '' end 

Для сравнения двух дат типа MM / DD / YYYY с MM / DD / YYYY . Помните, что тип столбца First thing Field должен быть DateTime. Пример: columnName: payment_date dataType: DateTime .

после этого вы можете легко сравнить его. Запрос:

 select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'. 

Это очень просто ...... Он протестировал это .....

  • Можно ли установить начало недели для функции T-SQL DATEDIFF?
  • t-sql получить все даты между двумя датами
  • Результаты запроса T-SQL по результатам запроса
  • Параметр Pass Array в SqlCommand
  • Как использовать необязательные параметры в хранимой процедуре T-SQL?
  • Получение последней записи в каждой группе из базы данных - SQL Server 2005/2008
  • Как сделать SQL как% в Linq?
  • Как округлить время в T-SQL
  • Усекать время от времени до второго (удалить миллисекунды) в T-SQL
  • Тестирование неравенства в T-SQL
  • Объединение INSERT INTO и WITH / CTE
  • Давайте будем гением компьютера.