我需要修改一段代码,其中用户输入3个字段:年,开始月和结束月。然后,它将对在开始月/结束月日期范围内发送的托盘数量进行求和。
我想修改它,使它在用户输入前一个月提取信息。
示例1:
@Year: 2022, @StartMonth: 1, @EndMonth: 5
它应该提取从2021年12月1日到2022年4月30日的数据。
示例2:
@Year: 2021, @StartMonth: 1, @EndMonth: 12
它应该提取2020年12月1日至2021年11月30日的数据。
我包含了原始代码,我不确定如何修改它,因为用户必须输入多少输入。
Original Code:
@Year int, @StartMonth int, @EndMonth int
SELECT SUM(Pallets) AS Expr1, DATEPART(mm, Date) AS Expr2, DATEPART(yyyy, Date) AS Expr3
FROM dbo.PalettesData
WHERE (DATEPART(mm, Date) BETWEEN @StartMonth AND @EndMonth) AND (DATEPART(yyyy, Date) = @Year)
GROUP BY DATEPART(mm, Date), DATEPART(yyyy, Date)
在上面的场景中,我总是倾向于从@StartMonth
,@EndMonth
和@Year
变量构建日期。
下面的代码演示了如何从提供的变量中获取日期。
Declare @StartMonth int=1 , @EndMonth int=10 , @Year int = 2020
---Expected resultset should be between 2019-12-01 till 2020-09-30
select
dateadd(month,-1,cast(cast(@Year as varchar)+case when @StartMonth <10 then '-0' else '-' end+cast(@StartMonth as varchar)+'-01' as date)) startdate,
dateadd(day,-1,cast(cast(@Year as varchar)+case when @EndMonth <10 then '-0' else '-' end+cast(@EndMonth as varchar)+'-01' as date)) as EndDate
话虽如此,你可以修改你的where子句如下(由于没有提供样本数据,我无法测试where子句)。:
WHERE Date BETWEEN
dateadd(month,-1,cast(cast(@Year as varchar)+case when @StartMonth <10 then '-0' else '-' end+cast(@StartMonth as varchar)+'-01' as date))
AND
dateadd(day,-1,cast(cast(@Year as varchar)+case when @EndMonth <10 then '-0' else '-' end+cast(@EndMonth as varchar)+'-01' as date))