MSSQL日期分析

时间:2017-08-09 12:52:30

标签: sql sql-server sql-server-2008 datetime analysis

我需要编写一个查询,其中查看过多的日期,并确定该日期是3年或更多年前,2年或更多年前,1年或更多年前,6个月或更多月前,或小于6个月前。 有没有办法在没有写入物理日期的情况下执行此操作,以便以后可以再次运行分析而无需更改日期? 我还没有开始编写查询,但我一直在尝试将其映射出来。

3 个答案:

答案 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有几个原因。

  1. 逻辑从代码移开。
  2. 可能会根据您的受众群体部署备用层。
  3. 最重要的是,事情会发生变化
  4. 以下内容将生成一系列日期,然后按所需的层进行汇总。我要补充一点,这是一个简化的例子

    示例

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

    返回(此示例)

    enter image description here