Но подождите, Марк ... вы сказали, что хотели бы использовать BETWEEN
, но в этом запросе его нет ... это потому, что BETWEEN
включает , что означает, что он включает в себя конец -точки. Если бы у меня был заказ, который должен был быть исполнен в полночь первого дня следующего месяца, он был бы включен. Итак, как вы получаете соответствующее значение для конца периода? Это, безусловно, НЕ при использовании частей даты для сборки (но вы должны, пожалуйста, помните, что это 23: 59: 59.997 как максимальное время ... не забывайте миллисекунды). Чтобы сделать это правильно, мы используем кровосмесительные знания о том, что столбцы Microsoft SQL Server DATETIME
имеют самое большее с разрешением 3 миллисекунды (что не изменится). Таким образом, все, что мы делаем, это вычитаем 3 миллисекунды из любой из приведенных выше формул на конец периода. Например, последний возможный момент вчерашнего дня (местное время):
SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0))
Таким образом, чтобы выполнить заказы в этом месяце как запрос BETWEEN
, вы можете использовать это:
SELECT [ID]
FROM [dbo].[Orders]
WHERE [ShipDue] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()), 0)
AND DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()) + 1, 0))
Помните, всегда проверяйте, что вы делаете математические операции с входными параметрами, NOT столбцами, иначе вы убьете в запросе возможность SARG , то есть индексы, которые могли используется не.