我有一个查询,我想添加参数来计算移动年度(过去12个月的数字)。我试图从今天开始减去12个月,所以如果今天是2012年8月1日那么我的@StartDate应该是'2011-09-01'而我的@EndDate应该是'2012-08-31'。那么如何更改设置我的参数以适应这个?
declare @StartDate DATE
declare @EndDate DATE
SET @StartDate = DATEADD(MONTH, -12, '2012-08-01')
SET @EndDate = DATEADD(MONTH, +1, '2012-08-01')
答案 0 :(得分:5)
DECLARE
@InputDate DATE,
@StartDate DATE,
@EndDate DATE
SET
@InputDate = '2012-08-01'
SET
@StartDate = DATEADD(MONTH, DATEDIFF(MONTH, 0, @InputDate) - 11, 0)
SET
@EndDate = DATEADD(DAY, -1, DATEADD(MONTH, 12, @StartDate))
修改强>
但是,我不使用'2011-09-01'
推荐'2012-08-31'
作为一年的代表。相反,请按以下方式使用'2011-09-01'
到'2012-09-01'
...
WHERE
table.dateField >= '2011-09-01'
AND table.dateField < '2012-09-01'
这适用于所有Date和DateTime数据类型。即使dateField
中的值是8月31日下午2:30,这仍然有效。这是一种适合所有人的方法,并且使得很多更难以在日期和时间边界上犯错。
答案 1 :(得分:0)
在上一个SET命令后添加:
SET @EndDate = DATEADD(DAY, -1, @EndDate)
或者用第二个SET代替:
SET @EndDate = DATEADD(DAY, -1,DATEADD(MONTH, +1, '2012-08-01'))
答案 2 :(得分:0)
尝试提示:
declare @Date DATE='2012-08-05'
select convert(date,DateAdd(Month, DateDiff(Month, 0, @Date)-11,0)) StartDate ,
convert(date,DateAdd(day,-1,DateAdd(Month,1,
DateAdd(Month, DateDiff(Month, 0, @Date),0)))) EndDate
结果:
StartDate EndDate
2011-09-01 2012-08-31
答案 3 :(得分:0)
这是几年前,但仍未正确回答。发布者希望找到距今天12个月的动态,“今天”是动态的。所有先前的答案都以硬编码的开始日期开头,而不是GETDATE()
DECLARE
@StartDate datetime,
@EndDate datetime
Set @StartDate = DATETIMEFROMPARTS(YEAR(GETDATE())-1, MONTH(GETDATE()), DAY(GETDATE()), 0, 0, 0, 0); Use midnight or a time that matches your business case.
Set @EndDate = DATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 23, 59, 59, 0); -- modify to match the times you are looking for.
Select * from Mydbase
WHERE
table.dateField between @StartDate and @EndDate