SQL:仅将日期与月份和年份列进行比较
我有一张表SQL:仅将日期与月份和年份列进行比较,sql,sql-server,tsql,sql-server-2008r2-express,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 |
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 |
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())
我想把过去3个月的数量加起来,不包括本月。我的where子句当前看起来像:
partnumber | quantity | month | year |
part1 | 12 | 6 | 2011 |
part1 | 22 | 5 | 2011 |
part1 | 32 | 4 | 2011 |
part1 | 42 | 3 | 2011 |
part1 | 52 | 2 | 2011 |
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())
在哪里
MonthlyShipments.Month月(GETDATE())和
铸造(
(以nvarchar(2)的形式铸造(每月装运)
'-01-' +
铸造(月装运。年为nvarchar(4)))为日期时间)
>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
可以添加日期列吗?如果您需要进行日期计算,并且不希望事情变得糟糕,那么这可能是一项要求。即使是一个简单的解决方案也会奏效 然后你可以这样做:
WHERE datecolumn < DATEADD(month, -3, GETDATE())
WHERE datecolumn
您可以将月份+日期转换为日期
,然后将其与当前日期进行比较:
WHERE DATEDIFF(m,CONVERT(DATE, [month]+'/01/'+[year],101), GETDATE())
BETWEEN 1 AND 3
或者,正如其他人所说,您可以创建一个新的计算列来保存日期
类型如果您有(年、月)
索引,我认为这将利用它:
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
)
不过看起来不太漂亮。即使是第一个也要好得多。。。简单地去掉字符串连接是更好的100倍:)您可以将其简化为单个DateAdd调用:
DateAdd(Month,(MonthlyShipments.Year-1900)*12+MonthlyShipments.Month-1,0)