Выберите между двумя месяцами - PullRequest
2 голосов
/ 19 марта 2012

Я пытаюсь написать запрос на выборку, где моя OrderDate составляет от двух месяцев.пока это мой код.

declare @FromMonth datetime
declare @ToMonth datetime
set @FromMonth = '20111201'
set @ToMonth = '20120301'

select *
from Order o
where o.OrderDate between @FromMonth and @ToMonth

Это почти работает, за исключением того, что он также смотрит на день месяца, что означает в этом примере, что он не будет выбирать все дни 'в моем @ ToMonth

Я использую Sql Server 2012

РЕДАКТИРОВАТЬ

Просто чтобы прояснить ситуацию, я не хочу доверять моим вводам @FromMonth и @ToMonth, чтобы знать последний деньв месяцВыше приведен пример, иллюстрирующий мою проблему.

Ответы [ 4 ]

4 голосов
/ 19 марта 2012

between редко работает так, как вы могли бы надеяться, я обычно считаю, что лучше записать диапазон как включающую / исключительную пару и применить соответствующие сравнения:

declare @FromMonth datetime
declare @ToMonth datetime
set @FromMonth = '20111201'
set @ToMonth = '20120401'

select *
from Order o
where o.OrderDate >= @FromMonth and o.OrderDate < @ToMonth

Это также позволит избежать злобности, еслиOrderDate включает компонент времени.

2 голосов
/ 19 марта 2012

Первая пара dateadd / datediff возвращает первый день месяца, вторая возвращает первый день следующего месяца:

where o.OrderDate >= dateadd(m, datediff (m, 0, @FromMonth), 0) 
  and o.OrderDate < dateadd(m, datediff (m, 0, @ToMonth) + 1, 0)

РЕДАКТИРОВАТЬ: изменил мой ответ в соответствии с советами Демс.

1 голос
/ 19 марта 2012

Измените предложение WHERE на что-то вроде:

WHERE (MONTH(o.OrderDate) BETWEEN MONTH(@FromMonth) AND MONTH(@ToMonth))
AND (YEAR(o.OrderDate) BETWEEN YEAR(@FromMonth) AND YEAR(@ToMonth))
0 голосов
/ 16 апреля 2016
WHERE MONTH(*col name*) between'01' and '05'

это даст данные ч / б с января по май, а имя столбца должно быть ДАТА КОЛОННЫ.

...