Ответ 1
Ответ SELECT DATEADD(ms, -3, '2008-01-24')
, пояснение ниже.
Из Блог Marc:
Но подождите, Марк... вы сказали, что хотите использовать
BETWEEN
, но этот запрос не имеет одного... потому чтоBETWEEN
является всеобъемлющим, то есть он включает конечные точки. Если бы у меня был Орден, который должен был быть в полночь первого дня следующего месяца, он был бы включен. Итак, как вы получаете соответствующее значение для конца периода? Это, безусловно, НЕ, используя детали даты, чтобы собрать их (но вы должны, пожалуйста, помните, что это 23: 59: 59.997 как максимальное время... не забудьте миллисекунды). Чтобы сделать это правильно, мы используем кровосмесительные знания о том, что столбцы Microsoft SQL ServerDATETIME
имеют не более 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))
Помните, что всегда делайте математику с входными параметрами, столбцами НЕ, или вы убьете SARG -защищенность запроса, что означает, что индексы, которые могли быть использованы, не являются.