2

OrderDate が 2 か月の間にある選択クエリを作成しようとしています。これはこれまでの私のコードです。

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 ペアは月の初日を返し、2 番目は翌月の初日を返します。

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

編集:民主党のアドバイスに従って私の応答を変更しました。

于 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 に答える