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

标签 sql sql-server tsql 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 |

我想对过去 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())

它确实有效,但它丑陋且具有侮辱性。有什么建议可以让它变得更漂亮吗?非常感谢!

最佳答案

也好不了多少...

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

关于SQL:仅比较日期与月份和年份列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283703/

相关文章:

php - 如何将数据插入位数据类型的字段?

sql - MS SQL 查询 - 如果不存在表

sql - 将 varchar 转换为日期时间字段

tsql - 与正常的行集相比,FOR XML AUTO 子句能否给出意想不到的结果?

asp.net - ExecuteReader 占用时间,不是在 SQL Server 中吗?

sql - 在 SQL Server 中存储 XML 文件

sql - sql中如何连接两个不相关的表

sql - 尝试在 SQL Server 中创建计算列

mysql - 使用模运算符获取样本

sql-server - 哈希值不匹配