我需要编写一个查询,其中查看过多的日期,并确定该日期是3年或更多年前,2年或更多年前,1年或更多年前,6个月或更多月前,或小于6个月前。 有没有办法在没有写入物理日期的情况下执行此操作,以便以后可以再次运行分析而无需更改日期? 我还没有开始编写查询,但我一直在尝试将其映射出来。
答案 0 :(得分:1)
您应该使用case
。我建议像:
select (case when datecol < dateadd(year, -3, getdate()) as '3 years ago'
when datecol < dateadd(year, -2, getdate()) as '2 years ago'
. . .
end)
我特别建议不要使用datediff()
。这是违反直觉的,因为它计算了边界的数量&#34;两个日期之间。所以,2016-12-31和2017-01-01相隔一年。
答案 1 :(得分:0)
您可以使用DATEDIFF函数计算两个日期之间的月数,天数,年数等,例如
select datediff(day, '2016-01-01', '2017-01-01')
返回366,因为2016年是闰年
要获取当前日期,请使用GETDATE()函数。
答案 2 :(得分:0)
我倾向于使用通用的Tier Table有几个原因。
以下内容将生成一系列日期,然后按所需的层进行汇总。我要补充一点,这是一个简化的例子
示例强>
-- Create Sample Tier Table
Declare @Tier table (Tier_Group varchar(50),Tier_Seq int,Tier_Title varchar(50),Tier_R1 int,Tier_R2 int)
Insert into @Tier values
('MyAgeTier',1,'+3 Years' ,36,999999)
,('MyAgeTier',2,'2 - 3 Years' ,24,36)
,('MyAgeTier',3,'1 - 2 Years' ,12,24)
,('MyAgeTier',4,'6 Mths - 1 Year',6 ,12)
,('MyAgeTier',5,'<6 Mths' ,0 ,6)
,('MyAgeTier',6,'Total ' ,0 ,999999)
Select Tier_Title
,Dates = count(*)
,MinDate = min(D)
,MaxDate = max(D)
From @Tier A
Join (
-- Your Actual Source
Select Top (DateDiff(DAY,'2010-01-01','2017-07-31')+1)
D=cast(DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),'2010-01-01') as date)
From master..spt_values n1,master..spt_values n2
) B
On Tier_Group = 'MyAgeTier' and DateDiff(MONTH,D,GetDate()) between Tier_R1 and Tier_R2-1
Group By Tier_Title,Tier_R1
Order by Tier_R1 Desc
返回(此示例)