SQL Select Case with Dynamic Dates

时间:2013-09-12 16:00:43

标签: sql sql-server case getdate

我真的不确定如何处理我正在寻找的查询,并希望有人可以帮助我。基本上我完全想要下面的查询,除了将它们与动态年份一起使用,这样我每年都不需要更新SPROC;

   SELECT 
    case 
    when Convert(varchar(8), getDate(),1) between '01/01/2013' and '03/31/2013' then '04/01/2013 - 06/30/2013' 
    when Convert(varchar(8), getDate(),1) between '04/01/2013' and '06/30/2013' then '07/01/2013 - 09/30/2013'
    when Convert(varchar(8), getDate(),1) between '07/01/2013' and '09/30/2013' then '10/01/2013 - 12/31/2013'
    when Convert(varchar(8), getDate(),1) between '10/01/2013' and '12/31/2013' then '01/01/2014 - 03/31/2014'
    end

我想让它像

一样运作
when Convert(varchar(8), getDate(), 1) between '01/01/currentYear' and '03/31/currentYear' then '04/01/thisyear - 06/30/currentYear'

如果有人能给我一些帮助,那就太好了。 非常感谢你, NickG

2 个答案:

答案 0 :(得分:1)

将年份作为参数传递:

DECLARE @YEAR VARCHAR(4)
SET @YEAR = DATEPART(YEAR,GETDATE())

SELECT 
    case 
    when Convert(varchar(8), getDate(),1) between '01/01/'+ @YEAR and '03/31/'+ @YEAR then '04/01/'+@YEAR+' - 06/30/'+@YEAR 
    when Convert(varchar(8), getDate(),1) between '04/01/'+ @YEAR and '06/30/'+ @YEAR then '07/01/'+@YEAR+' - 09/30/'+@YEAR
    when Convert(varchar(8), getDate(),1) between '07/01/'+ @YEAR and '09/30/'+ @YEAR then '10/01/'+@YEAR+' - 12/31/'+@YEAR
    when Convert(varchar(8), getDate(),1) between '10/01/'+ @YEAR and '12/31/'+ @YEAR then '01/01/'+@YEAR+' - 03/31/'+@YEAR
    end

答案 1 :(得分:1)

您可以在不使用CASE声明的情况下执行此操作:

SELECT CONVERT(VARCHAR(8),(DATEADD(quarter, 1+DATEDIFF(quarter, 0, GETDATE()), 0)),1)+ ' - ' 
     + CONVERT(VARCHAR(8),(DATEADD(day,-1,DATEADD(quarter, 2+DATEDIFF(quarter, 0, GETDATE()), 0))),1)

确认它适用于其他日期:

DECLARE @date DATE = '2012-12-10'
SELECT CONVERT(VARCHAR(8),(DATEADD(quarter, 1+DATEDIFF(quarter, 0, @date), 0)),1)
        + ' - ' 
        + CONVERT(VARCHAR(8),(DATEADD(day,-1,DATEADD(quarter, 2+DATEDIFF(quarter, 0, @date), 0))),1)