2

我正在尝试编写一个选择查询,其中我的 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 回答 4

5

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如果包含时间组件,这也将避免麻烦。

于 2012-03-19T09:48:15.660 回答
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 的建议更改了我的回复。

于 2012-03-19T09:48:00.110 回答
1

将您的 WHERE 子句更改为:

WHERE (MONTH(o.OrderDate) BETWEEN MONTH(@FromMonth) AND MONTH(@ToMonth))
AND (YEAR(o.OrderDate) BETWEEN YEAR(@FromMonth) AND YEAR(@ToMonth))
于 2012-03-19T09:45:21.663 回答
0
WHERE MONTH(*col name*) between'01' and '05'

这将提供从 Jan 到 May 的数据 b/w 并且col 名称应该是 DATE COLUMN。

于 2016-04-16T13:55:42.690 回答