У меня есть две таблицы, где столбец [date]
типа DATETIME2(0)
.
Я должен сравнить две записи только по их частям Date (день + месяц + год), отбрасывая части Time (часы + минуты + секунды).
Как я могу это сделать?
У меня есть две таблицы, где столбец [date]
типа DATETIME2(0)
.
Я должен сравнить две записи только по их частям Date (день + месяц + год), отбрасывая части Time (часы + минуты + секунды).
Как я могу это сделать?
Ответы:
Небольшой недостаток в ответе Марка состоит в том, что оба поля дат были типизированы, что означает, что вы не сможете использовать какие-либо индексы.
Таким образом, если существует необходимость написать запрос, который может извлечь выгоду из индекса для поля даты, тогда необходим следующий (довольно запутанный) подход.
(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)
Хотя я проголосовал за ответ, помеченный как правильный. Я хотел бы коснуться нескольких вещей для любого, кто наткнулся на это.
В общем, если вы фильтруете только по значениям Date . 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
Вы можете попробовать это
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
Для сравнения две даты, такие как ММ / ДД / ГГГГ в ММ / ДД / ГГГГ . Помните, что первым делом тип столбца Field должен быть dateTime. Пример: columnName: payment_date dataType: DateTime .
после этого вы можете легко сравнить это. Запрос это:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
Это очень просто ...... Это проверило это .....