2013-05-31 74 views
3

我想檢索兩個日期之間不同年份的列表。兩個日期之間不同年份的列表

例如,從25/12/200614/11/2013,結果應該是這樣的:

2006 
2007 
2008 
2009 
2010 
2011 
2012 
2013 

在SQL Server這可能嗎?

+1

這是不是一個真正的問題?很難看出如何澄清這個問題。 – Andomar

+1

同意 - 問題是精確的,簡潔的,並在點 –

+0

關閉擋板.. – iruvar

回答

10

1/2/2013這樣的日期不明確:取決於區域設置,它可以是2月1日或1月2日。因此,在與數據庫交談時使用日期格式是個好主意。

你就可以使用遞歸CTE號碼清單:

; 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'as datetime);'根據[documentation](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 
相關問題