我正在尝试编写一个只返回过去3个月,6个月,9个月或一年的数据的存储过程。它只需要整整几个月(如果拉8/15;最近将是7月)
到目前为止,我已经找到了如何找出上个月的第一天和最后一天。
SELECT DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0))as 'First day of the month',
DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) as 'Last day of the month'
需要检查的字段是TransactionDateKey(即20161222)。我想我应该在该领域使用CAST来检查月和日(即201612),但我可能错了。下面是我认为我应该根据我的查询但没有硬编码日期的粗略模型
select FirstName + ' ' + LastName as 'Specialist',
empID as 'empID',
count(fact.spKey) as 'Count',
CAST(LEFT(CAST(TransactionDateKey AS VARCHAR(100)), 6) AS INT) as 'Month'
from Final.DimSpecialist s
inner join Final.FactTreatmentDay fact
on fact.spKey = s.spKey
where TransactionDateKey between 20161201 and 20161231
group by FirstName + ' ' + LastName,
empID,
CAST(LEFT(CAST(TransactionDateKey AS VARCHAR(100)), 6) AS INT)
如何声明单个参数@MonthRange,并在WHERE子句中使用它仅返回过去3个月,6个月,9个月或一年的数据?我认为该参数需要放置在-1月的第一天'中。我认为还应该有一个案例陈述来检查4个可能的参数值中的每一个,但我不确定它应该去哪里。任何建议都将不胜感激。
答案 0 :(得分:1)
我相信有一些有趣的方法可以使用日期维度表来计算日期,你有一个年份字段,我选择提供一个与你已经拥有的答案非常匹配的答案,如果你没有这样的表: - )
declare @months_to_report int; --procedure parameter
--Validation
if @months_to_report not in (3, 6, 9, 12) raiserror('Months to report must be one of 3, 6, 9, or 12.', 18, 1);
--Variables
declare @first date, @start date, @end date, @start_key int, @end_key int;
set @first = DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)); --first day of previous month
set @end = DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)); --last day of previous month
set @start = DATEADD(M, 1 - @months_to_report, @first); --move back n-1 months to account for including previous month
set @start_key = Year(@start) * 10000 + Month(@start) * 100 + Day(@start); --start date as keys
set @end_key = Year(@end) * 10000 + Month(@end) * 100 + Day(@end); --end date as keys
select @first as 'First day of the month', @start as 'First day of reporting period', @end as 'Last day of the month/reporting period', @start_key as 'Start key', @end_key as 'End key';
此代码假定传递的参数为@months_to_report
。我更喜欢验证存储过程中的参数。结束select
仅用于调试目的。您可以修改您提供的示例代码,以便在硬编码日期对@start_key和@end_key进行补充。