查询中的sql日期参数

时间:2012-08-01 13:04:12

标签: sql

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

答案 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