选择两个月

问题描述 投票:0回答:5

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

sql datetime sql-server-2012
5个回答
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
包含时间成分,这也可以避免令人讨厌的情况。


2
投票

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

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

编辑:根据民主党的建议更改了我的回复。


1
投票

将 WHERE 子句更改为:

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

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

这将提供从一月到五月的数据,并且列名称应该是日期列。


0
投票

我正在使用这种方法。效果很好,仅使用 1 个

where

@startYear
@startMonth
@endYear
@endMonth
是事先声明的
int

SELECT *
FROM Order
WHERE (Year(OrderDate) * 12 + Month(OrderDate))
BETWEEN (@startYear * 12 + @startMonth)
AND (@endYear * 12 + @endMonth);
© www.soinside.com 2019 - 2024. All rights reserved.