4

我有一个查询,我想添加参数来计算移动年度(过去 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')
4

4 回答 4

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'to'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,这仍然有效。这是一种万能的方法,使在日期和时间界限上犯错误变得更加困难

于 2012-08-01T13:11:31.203 回答
1

这是几年前的事了,但仍然没有正确回答。发帖人想找到从今天开始的 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

于 2019-09-30T21:29:58.800 回答
0

在最后一个 SET 命令之后添加:

SET @EndDate = DATEADD(DAY, -1, @EndDate)

或将第二组替换为:

SET @EndDate = DATEADD(DAY, -1,DATEADD(MONTH, +1, '2012-08-01'))
于 2012-08-01T13:08:26.037 回答
0

试试tiis:

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
于 2012-08-01T13:11:41.587 回答