2016-09-20 28 views
0

我想在SQL Server的不同年份的四分之二之间找到记录。查找SQL Server中两个Quarters之间的记录?

SELECT ('Q'+cast(DATEPART(QUARTER,calldate) as varchar(3))+'-'+cast(YEAR(calldate) as varchar(4))) 
period,providerid,volume as volume,type 
FROM table V  
where DATEPART(QUARTER,calldate) between @Q1 and @Q2 and        
datepart(year,calldate) in (@Y1,@Y2) and [email protected] 

这里Q1 = 4,Q2 = 3和@ Y1 = 2014 @ Y2 = 2016

Now,I have only records from Q2-2016, So it should return available records  
but I am getting blank rows. 
if I change the parameter like this 
Here Q1=3 and Q2=4 and @Y1=2014,@Y2=2016 then i am getting records. 

我想这两个季度一样(Q3-2014和Q2-2016之间的所有记录)?

回答

2

这里有一个方法:

where datename(year, calldate) + datename(quarter, calldate) 
      between @Y1 + @Q1 and @Y2 + @Q2; 

这假设变量实际上是字符串。你也可以做到这一点使用数字:

where datepart(year, calldate) * 10 + datename(quarter, calldate) 
      between @Y1 * 10 + @Q1 and @Y2 * 10 + @Q2; 

而且,这里是将使用索引的方式:

where calldate >= datefromparts(@Y1, @Q1*3 - 2, 1) and 
     calldate < (case when @Q2 = 4 
         then datefromparts(@Y2 + 1, 1, 1) 
         else datefromparts(@Y2, @Q2*3 - 2 + 3, 1) 
        end) 
+0

年份和季度的东西是类型tinyint –

+0

@Ramdeoangh。 。 。你有一个问题,如果他们是'tinyint',因为它不足以存储一年(https://technet.microsoft.com/en-us/library/ms187745(v=sql.105).aspx)。 –

+1

是你全年的@年,例如2016年,但不仅仅是16年? – Cato

1

可以尝试这样

SELECT  
('Q'+cast(DATEPART(QUARTER,calldate) as varchar(3))+'-'+cast(YEAR(calldate) as varchar(4))) 
period,providerid,volume as volume,type 
FROM table V  
where DATEPART(QUARTER,calldate) + datepart(year,calldate) *4 between @Q1 + @Y1 * 4 and @Q2 + @Y2 * 4 
+0

这也是工作的人。谢谢 –

相关问题