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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

  • Отметьте дату как float.
  • Усечение дробной части
  • Верните значение в datetime
  • т.е. CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

Ответ 3

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

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

Обратите внимание, что форма '2007-02-12' считается только нейтральной по языку для типов данных DATE, DATETIME2 и DATETIMEOFSFS.

Сделать сравнение даты с использованием вышеупомянутого подхода просто. Рассмотрим следующий, надуманный пример.

--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

Ответ 4

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

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

Ответ 5

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

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

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

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