两个月之间选择

时间:2012-03-19 09:36:52

标签: sql datetime sql-server-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 个答案:

答案 0 :(得分:4)

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包含时间组件,这也可以避免肮脏。

答案 1 :(得分:2)

第一个dateadd / datediff对返回月的第一天,第二个返回下个月的第一天:

where o.OrderDate >= dateadd(m, datediff (m, 0, @FromMonth), 0) 
  and o.OrderDate < dateadd(m, datediff (m, 0, @ToMonth) + 1, 0)
编辑:根据dems的建议更改了我的回复。

答案 2 :(得分:1)

将WHERE子句更改为:

WHERE (MONTH(o.OrderDate) BETWEEN MONTH(@FromMonth) AND MONTH(@ToMonth))
AND (YEAR(o.OrderDate) BETWEEN YEAR(@FromMonth) AND YEAR(@ToMonth))

答案 3 :(得分:0)

WHERE MONTH(*col name*) between'01' and '05'

这将提供数据b / w Jan到May, col name 应该是DATE COLUMN。