2013-05-31 5 views
3

Я хотел бы получить список отчетных лет между двумя датами.Список отдельных лет между двумя датами

Например, от 25/12/2006 к 14/11/2013, результат должен выглядеть следующим образом:

2006 
2007 
2008 
2009 
2010 
2011 
2012 
2013 

Возможно ли это в SQL Server?

+1

Как это не вопрос? Трудно понять, как этот вопрос можно прояснить. – Andomar

+1

Согласен - вопрос точный, лаконичный и до точки –

+0

Сбитый с толку на крышке .. – iruvar

ответ

10

Дата, подобная 1/2/2013, неоднозначна: в зависимости от региональных условий это может быть либо 1 февраля, либо 2 января. Поэтому неплохо использовать формат даты YYYY-MM-DD при разговоре с датой.

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

; with CTE as 
     (
     select datepart(year, '2006-12-25') as yr 
     union all 
     select yr + 1 
     from CTE 
     where yr < datepart(year, '2013-11-14') 
     ) 
select yr 
from CTE 

Example at SQL Fiddle.

+0

Спасибо, что он работает .. –

+0

На самом деле 'YYYY-MM-DD' также неоднозначен:' set language french; выберите cast ('2001-12-14' как дата-время); 'Согласно [документации] (http://msdn.microsoft.com/en-us/library/ms187819.aspx),' YYYYMMDD' является подходящим коротким формат для констант 'datetime'. – Pondlife

+0

@ Andomar. , , Я думаю, вы правильно поняли вопрос и дали действительно хороший ответ. Я проголосовал за повторное открытие вопроса. –

2

Проверено на SQL Server 2008

declare @smaller_date date = convert(date, '25/12/2006', 103) 
declare @larger_date date = convert(date, '14/11/2013', 103) 
declare @diff int 
select @diff = DATEDIFF(YY, @smaller_date, @larger_date) 

;with sequencer(runner) as(
select 0 
union all 
select sequencer.runner + 1 from sequencer 
where runner < @diff 
) 
select YEAR(@smaller_date) + runner from sequencer 
+0

благодарит свою работу ... –

1
CREATE FUNCTION [dbo].Fn_Interval 
( 
    @p1 datetime2, 
    @p2 datetime2 
) 
RETURNS @dt TABLE 
(
    YearValue int not null 
) 
AS 
BEGIN 

    declare @start as int 
    declare @end as int 

    set @start = DATEPART(year, @p1); 
    set @end = DATEPART(year, @p2); 

    while (@start <= @end) 
    begin 
     INSERT @dt 
     SELECT @start; 
     set @start = @start + 1; 
    end 

    RETURN; 
END 

открыть запрос и попробуйте:

declare @p1 as datetime2; 
declare @p2 as datetime2; 

set @p1 = '2013-12-31'; 
set @p2 = '2020-05-05'; 

select * 
from dbo.Fn_Interval(@p1, @p2) 
-1

Сначала создайте calendar table. Затем вы просто запрашиваете годы:

select distinct YearNumber 
from dbo.Calendar 
where [Date] between '20061225' and '20131114' 
order by YearNumber 
Смежные вопросы