4

MonthlyShipments次のようなテーブルがあります。

partnumber | quantity | month | year |
part1      |       12 |     6 | 2011 |
part1      |       22 |     5 | 2011 |
part1      |       32 |     4 | 2011 |
part1      |       42 |     3 | 2011 |
part1      |       52 |     2 | 2011 |

当月を除く過去 3 か月の数量を合計したいと考えています。私のwhere句は現在次のようになっています:

where
  MonthlyShipments.Month <> MONTH(GETDATE()) AND 
  CAST(
    (CAST(MonthlyShipments.Month as nvarchar(2)) + 
    '-01-' + 
    CAST(MonthlyShipments.Year as nvarchar(4))) as DateTime)
  > DATEADD(m, -4, GETDATE())

それは機能しますが、醜くて侮辱的です。可愛くするコツはありますか?とても感謝しています!

4

4 に答える 4

5

あまり良くない...

DATEDIFF(
    month,
    DATEADD(Year, MonthlyShipments.Year-1900,
        DATEADD(Month, MonthlyShipments.Month-1, 0)
           ),
    GETDATE()
    ) BETWEEN 1 AND 3

ただし、ネストされた DATEADD は、計算されたインデックス付きの列にすることができます

ALTER TABLE MonthlyShipments ADD
    ShipDate AS DATEADD(Year, MonthlyShipments.Year-1900,
            DATEADD(Month, MonthlyShipments.Month-1, 0)
               )

を与える

WHERE DATEDIFF(month, ShipDate, GETDATE()) BETWEEN 1 AND 3
于 2011-06-08T18:57:48.090 に答える
1

日付列を追加できますか? 日付の計算を行う必要があり、物事を醜くしたくない場合、これはおそらく要件になるでしょう。計算列でも機能します...

次に、次のようなことができます。

WHERE datecolumn < DATEADD(month, -3, GETDATE())
于 2011-06-08T18:58:02.137 に答える
0

インデックスがある場合(year,month)、これはそれを利用すると思います:

FROM MonthlyShipments ms
WHERE ( ms.year = YEAR(GetDate()) 
        AND ms.month BETWEEN MONTH(GetDate())-3
                         AND MONTH(GetDate())-1
      )
   OR ( ms.year = YEAR(GetDate())-1
        AND ms.month BETWEEN 12 + MONTH(GetDate())-3
                         AND 12 + MONTH(GetDate())-1
      ) 

しかし、あまりきれいに見えません。

于 2011-06-08T20:57:49.920 に答える
0

月と日付を変換dateして現在の日付と比較できます。

WHERE DATEDIFF(m,CONVERT(DATE, [month]+'/01/'+[year],101), GETDATE()) 
BETWEEN 1 AND 3

または、他の人が言ったように、date型を保持する新しい計算列を作成できます

于 2011-06-08T19:10:23.270 に答える