У меня есть две таблицы, где столбец [date]
является типом DATETIME2(0)
.
Мне нужно сравнить две записи только по их части Date (день + месяц + год), отбрасывая временные части (часы + минуты + секунды).
Как я могу это сделать?
У меня есть две таблицы, где столбец [date]
является типом DATETIME2(0)
.
Мне нужно сравнить две записи только по их части Date (день + месяц + год), отбрасывая временные части (часы + минуты + секунды).
Как я могу это сделать?
Используйте CAST
для нового типа данных DATE
в SQL Server 2008, чтобы сравнить только часть даты:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
Небольшой недостаток ответа Marc заключается в том, что оба поля даты были typecast, то есть вы не сможете использовать любые индексы.
Итак, если есть необходимость написать запрос, который может извлечь выгоду из индекса в поле даты, тогда необходим следующий (довольно запутанный) подход.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: Еще одно средство для извлечения только даты (в старых версиях SQL Server) заключается в том, чтобы использовать трюк о том, как дата представлена внутри.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
Хотя я подтвердил ответ, обозначенный как правильный. Я хотел затронуть несколько вещей для тех, кто наткнулся на это.
В общем случае, если вы фильтруете только значения Дата. Корпорация Майкрософт рекомендует использовать формат нейтрального языка 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
Вы можете попробовать этот
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
Для сравнения двух дат типа ММ/ДД/ГГГГ - ММ/ДД/ГГГГ. Помните, что тип столбца First thing Field должен быть DateTime. Пример: columnName: payment_date dataType: DateTime.
после этого вы можете легко сравнить его. Запрос:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
Это очень просто...... Он протестировал его.....