SQL:仅将日期与月份和年份列进行比较

ano*_*ous 4 sql t-sql sql-server sql-server-2008r2-express

我有一张表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 |
Run Code Online (Sandbox Code Playgroud)

我想总结过去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())
Run Code Online (Sandbox Code Playgroud)

它有效,但它的丑陋和侮辱.有什么建议使它更漂亮?非常感谢!

gbn*_*gbn 5

好多了......

DATEDIFF(
    month,
    DATEADD(Year, MonthlyShipments.Year-1900,
        DATEADD(Month, MonthlyShipments.Month-1, 0)
           ),
    GETDATE()
    ) BETWEEN 1 AND 3
Run Code Online (Sandbox Code Playgroud)

但是嵌套的DATEADD可以成为计算和索引的列

ALTER TABLE MonthlyShipments ADD
    ShipDate AS DATEADD(Year, MonthlyShipments.Year-1900,
            DATEADD(Month, MonthlyShipments.Month-1, 0)
               )
Run Code Online (Sandbox Code Playgroud)

这使

WHERE DATEDIFF(month, ShipDate, GETDATE()) BETWEEN 1 AND 3
Run Code Online (Sandbox Code Playgroud)

  • 您可以将此简化为单个DateAdd调用:`DateAdd(Month,(MonthlyShipments.Year - 1900)*12 + MonthlyShipments.Month - 1,0) (2认同)