我想檢索兩個日期之間不同年份的列表。兩個日期之間不同年份的列表
例如,從25/12/2006
到14/11/2013
,結果應該是這樣的:
2006
2007
2008
2009
2010
2011
2012
2013
在SQL Server這可能嗎?
我想檢索兩個日期之間不同年份的列表。兩個日期之間不同年份的列表
例如,從25/12/2006
到14/11/2013
,結果應該是這樣的:
2006
2007
2008
2009
2010
2011
2012
2013
在SQL Server這可能嗎?
像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
謝謝你的工作.. –
事實上,'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
@Andomar。 。 。我認爲你正確理解了這個問題並給出了一個非常好的答案。我投票重新提出了這個問題。 –
測試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
感謝它的工作...... –
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)
首先,創建一個calendar table。然後你簡單地查詢幾年:
select distinct YearNumber
from dbo.Calendar
where [Date] between '20061225' and '20131114'
order by YearNumber
這是不是一個真正的問題?很難看出如何澄清這個問題。 – Andomar
同意 - 問題是精確的,簡潔的,並在點 –
關閉擋板.. – iruvar