在两个月之间选择

gul*_*aek 2 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
Run Code Online (Sandbox Code Playgroud)

这几乎有效,除了它还会查看月份中的哪一天,这意味着在此示例中它不会选择我的 @ToMonth 中的所有天

我正在使用 Sql Server 2012

编辑

只是为了更清楚,我不想相信我的 @FromMonth 和 @ToMonth 输入知道当月的最后一天。以上只是一个示例来说明我的问题。

Dam*_*ver 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
Run Code Online (Sandbox Code Playgroud)

如果OrderDate包含时间组件,这也将避免令人讨厌。

  • @gulbaek - 这不是作弊,而是修复。您的输入是一个 DATETIME,一个 *continuous* 值。`20120301` 并不意味着“三月的所有”,它意味着“3 月 1 日的 00:00”。`BETWEEN` 用于离散值,如整数。使用 `&gt;=` 和 `&lt;` 表示连续值。如果该字段是 FLOAT,您不会期望 `WHERE my_float BETWEEN 1 AND 2` 包含 `2.9`。为此,您应该说“WHERE my_float &gt;= 1 AND my_float &lt; 3”。同样,在您的情况下,如果您只想要一个月,则您的参数都是“20120101”,但这些值之间没有时间。使用 `&lt;` 使这更有意义。 (2认同)