我正在尝试编写一个选择查询,其中我的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输入知道本月的最后一天。以上只是说明我问题的一个例子。
答案 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。