2013-12-17 4 views
3

Я две даты говорят '2011-01-23' и '2015-11-29',Получить все помещения в месяц, формат год между двумя датами

  • «2011-01-23» падает в первом квартале 2011 года, так 'Jan 2011'

  • «2015-11-29» падает в четвертом квартале 2015 года, так 'Oct 2015'

в SQL Server я хочу получить все кварталы в списке выбора. , например.

Вход: @StartDate='2011-01-23' , @EndDate='2015-11-29'

Выход:

Jan 2011 
Apr 2011 
Jul 2011 
Oct 2011 
Jan 2012 
Apr 2012 
Jul 2013 
Oct 2013 
Jan 2014 
...... 
...... 
...... 
Jul 2015 
Oct 2015 

ответ

5

Вы можете использовать рекурсивное ОТВ для создания даты следующим образом:

declare @StartDate datetime 
declare @EndDate datetime 
select @StartDate='2011-01-23' , @EndDate='2015-11-29' 

;With Quarters as (
    select DATEADD(quarter,DATEDIFF(quarter,0,@StartDate),0) as dt 
    union all 
    select DATEADD(quarter,1,dt) 
    from Quarters 
    where dt < DATEADD(quarter,DATEDIFF(quarter,0,@EndDate),0) 
) 
select 
    --I'd usually keep them as dates at this point, but to match your requirement 
    CONVERT(varchar(3),dt,109) + ' ' + CONVERT(varchar(4),dt,120) 
from Quarters order by dt 

Это также использует несколько других трюков - это использует CONVERT с слишком короткими целевыми типами данных, чтобы быстро обрезать строки только части, которые мы хотим сохранить, - и использует DATEADD/DATEDIFF, чтобы быстро округлить значение datetime до ближайшей границы интервала.

Для SQL Server 2012, можно использовать вместо FORMAT для получения выходной строки, но я не экспериментировал с этим много, поэтому я оставлю это упражнение ...

+0

Большое спасибо Damien, То же решение, которое я нашел в Интернете. –

0

Наконец, я нашел решение моего вопроса ..

WITH mycte AS 
(
    SELECT CAST('2011-01-01' AS DATE) DateValue 
    UNION ALL 
    SELECT DATEADD(Q,1,DateValue) FROM mycte WHERE DATEADD(Q,1,DateValue) < '2012-12-31' 
) 

SELECT CONVERT(varchar(3), DATENAME(MONTH,DateValue))+ ' ' +Convert(varchar(4),DATEPART(YYYY,DateValue)) FROM mycte OPTION (MAXRECURSION 0) 
+0

Я ищу ту же функцию в mysql, можете ли вы мне помочь – Ahmed

Смежные вопросы