В SSMS, как я могу использовать функцию DATEADD, чтобы получить все значения между «2018-09-01 00: 00: 00.000» и «2018-09-01 023: 59: 00.000» - PullRequest
0 голосов
/ 31 августа 2018

Я использую SQL Server Management Studio 2014 и пытаюсь написать запрос, чтобы получить все значения, для которых указаны даты, следующие в днях. Я не хочу жестко кодировать условие между датами и хочу использовать DateAdd или аналогичный Функция так работает последовательно без изменения синтаксиса. Пример жесткого кода запроса приведен ниже.

SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
between '2018-09-01 00:00:00.000' and '2018-09-01 023:59:00.000'

Как лучше всего написать синтаксис для этого, используя DATEADD или подобную функцию?

Есть ли способ, которым я не могу различить время извлеченных значений? Например, просто потяните все с 2018-09-01 и не исключайте записи, основанные на их формате времени

Могу ли я использовать AddDate with для достижения этой цели?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Я думаю, что самый «чистый» способ - использовать методы DATEFROMPARTS и DATEPART:

SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
WHERE DATEFROMPARTS(
    DATEPART(YEAR, OrderDate),
    DATEPART(MONTH, OrderDate),
    DATEPART(DAY, OrderDate)) = '2018-09-01'

Редактировать: это не хорошо для производительности. См. Ответ HABO для оптимального способа сделать это.

0 голосов
/ 01 сентября 2018

Создание условия WHERE SARGABLE , чтобы оно могло использовать индексы, может значительно повысить производительность. Лучше всего не пытаться получить «последнее» время дня, просто используйте полуоткрытый интервал :

declare @Today as DateTime = Cast( GetDate() ); -- Strip the time-of-day.

select OrderId
  from [XXXX].[dbo].[INBOUNDORDHEADER]
  where DateAdd( day, 1, @Today ) <= OrderDate and OrderDate < DateAdd( day, 2, @Today );
0 голосов
/ 31 августа 2018

Не супер элегантно, но вы можете использовать приведение к ДАТА, чтобы лишить времени:

SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
BETWEEN DATEADD(day, 1, CAST(GETDATE() As DATE)) AND DATEADD(day, 2, CAST(GETDATE() As DATE))

Это даст вам диапазон дат с полуночи завтра до полуночи послезавтра. Используя ваш пример и сегодняшнюю дату, это будет МЕЖДУ '2018-09-01 00:00:00' И '2018-09-02 00: 00: 00'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...