我正在尝试编写一个选择查询,其中我的 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 输入来知道该月的最后一天。上面只是一个示例来说明我的问题。
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
包含时间成分,这也可以避免令人讨厌的情况。
第一个 dateadd/datediff 对返回该月的第一天,第二个返回下个月的第一天:
where o.OrderDate >= dateadd(m, datediff (m, 0, @FromMonth), 0)
and o.OrderDate < dateadd(m, datediff (m, 0, @ToMonth) + 1, 0)
编辑:根据民主党的建议更改了我的回复。
将 WHERE 子句更改为:
WHERE (MONTH(o.OrderDate) BETWEEN MONTH(@FromMonth) AND MONTH(@ToMonth))
AND (YEAR(o.OrderDate) BETWEEN YEAR(@FromMonth) AND YEAR(@ToMonth))
WHERE MONTH(*col name*) between'01' and '05'
这将提供从一月到五月的数据,并且列名称应该是日期列。
我正在使用这种方法。效果很好,仅使用 1 个
where
。
@startYear
、@startMonth
、@endYear
和@endMonth
是事先声明的int
。
SELECT *
FROM Order
WHERE (Year(OrderDate) * 12 + Month(OrderDate))
BETWEEN (@startYear * 12 + @startMonth)
AND (@endYear * 12 + @endMonth);