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

您可以将您的月份+日期转换为date,然后将其与当前日期进行比较:

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

或者正如其他人所说,您可以创建一个包含date类型的新计算列

于 2011-06-08T19:10:23.270 回答
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 回答