Порівняйте DATETIME та DATE ігноруючи проміжок часу


151

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

Я повинен порівнювати два записи лише за їх частинами за датою (день + місяць + рік), відкидаючи частини часу (години + хвилини + секунди).

Як я можу це зробити?

Відповіді:


252

Використовуйте CASTновий DATEтип даних у SQL Server 2008 для порівняння лише частини дати:

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

61

Невеликий недолік у відповіді Марка полягає в тому, що обидва поля дат були введені на клавіатурі, тобто ви не зможете використовувати жодні індекси.

Отже, якщо є необхідність написати запит, який може отримати користь від індексу в полі дати, тоді необхідний наступний (досить згорнутий) підхід.

  • Індексоване поле дати (називайте його 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) є використання хитрості того, як дата представлена ​​внутрішньо.

  • Дату відлийте як поплавок.
  • Обріжте дробову частину
  • Відкиньте значення назад у дату
  • Тобто CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

5

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

Загалом, якщо ви фільтруєте спеціально лише значення Дати . 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

3

Ви можете спробувати це

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

-3

Для порівняння дві дати, як MM / DD / РРРР з MM / DD / РРРР . Пам'ятайте, тип першого поля стовпця "Річ" повинен бути dateTime. Приклад: Ім'я стовпця: Payment_date dataType: DateTime .

після цього ви можете легко порівняти його. Запит:

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

Це дуже просто ...... Це протестувало .....


Це не зовсім відповідає на питання. Він запитує місяць, а не день.
Кертіс Яллоп

Для вашого запиту на березень: Якщо дата - 13.3.2015 «13:00, вона не буде знайдена. Вам слід скористатися <'4/1/2015'.
Кертіс Яллоп

Також розглянути можливість використання міжнародного формату дати "2015-03-01". У Канаді (та багатьох інших місцях) офіційним форматом є DD / MM / YYYY, що робить обидва формати неоднозначними та проблематичними.
Кертіс Яллоп

Ця відповідь не стосується двох таблиць, про що вимагається у запитанні.
Кертіс Яллоп

Так, я згоден, але я просто доказую рішення не міжнародне рішення .. вам доведеться змінити якийсь порядок ...
pankaj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.