2017-08-31 114 views
3

我有這個查詢,給了我過去15年每一個給定的日期。當我的開始日期是2月29日時,它不會返回2012年,2008年和2004年的29年。我怎樣才能讓這個查詢返回那些年份的29歲?如何保持閏年,減少1年

DECLARE @TempDate1 TABLE (Entry_Date Date) 
INSERT INTO @TempDate1 values ('2016-02-29') 
;WITH 
     a AS(SELECT DATEADD(yy,-1,Entry_Date) d, DATEADD(yy,-1,Entry_Date) d2,0 i 
     FROM @TempDate1 
      UNION all 
     SELECT DATEADD(yy,-1,d),DATEADD(yy,-1,d2),i+1 FROM a WHERE i<14), 
     b AS(SELECT d,d2, DATEDIFF(dd,0,d)%7 dd,i FROM a) 
SELECT 
d AS Entry_Date 
FROM b 

它返回:

Entry_Date 
2015-02-28 
2014-02-28 
2013-02-28 
2012-02-28 
2011-02-28 
2010-02-28 
2009-02-28 
2008-02-28 
2007-02-28 
2006-02-28 
2005-02-28 
2004-02-28 
2003-02-28 
2002-02-28 
2001-02-28 

雖然我想有這樣的:只需使用EOMONTH功能(SQL Server 2012中及以上)

Entry_Date 
2015-02-28 
2014-02-28 
2013-02-28 
2012-02-29 
2011-02-28 
2010-02-28 
2009-02-28 
2008-02-29 
2007-02-28 
2006-02-28 
2005-02-28 
2004-02-29 
2003-02-28 
2002-02-28 
2001-02-28 
+1

而不是從前一個減去一年保持軌道的原始條目日期並使用'i'來減去正確的年數。 –

回答

1

也許使用DateAdd在一個特設的理貨臺音樂會

Declare @YourTable Table ([Entry_Date] date) 
Insert Into @YourTable Values 
('2016-02-29') 
,('2015-07-22') 

Select YearNr = N 
     ,Anniv = dateadd(YEAR,N*-1,Entry_Date) 
From @YourTable A 
Cross Apply (
       Select Top 15 N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1 
      ) B 

返回

enter image description here

0

DECLARE @TempDate1 TABLE (Entry_Date Date) 
INSERT INTO @TempDate1 values ('2016-02-29') 
;WITH 
     a AS(SELECT DATEADD(yy,-1,Entry_Date) d, DATEADD(yy,-1,Entry_Date) d2,0 i 
     FROM @TempDate1 
      UNION all 
     SELECT DATEADD(yy,-1,d),DATEADD(yy,-1,d2),i+1 FROM a WHERE i<14), 
     b AS(SELECT d,d2, DATEDIFF(dd,0,d)%7 dd,i FROM a) 
SELECT EOMONTH(d) AS Entry_Date 
FROM b; 

Rextester Demo

+0

如果EntryDate並非總是月末? –

+0

@ lad2025我的例子顯示月結束的值,但原始表的日期是一年中的每一天,而不僅僅是月末。 – JulGreen

+0

@JulGreen所以它是** [XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)**然後。你想創建DimDate表並填充它,一種方法使用添加1:[填充日期維度表](https://stephanefrechette.com/date-dimension/) – lad2025

0

讀和寫像這樣的ite瀏覽查詢......不僅可以處理閏年而不會跳過箍環,它的數量級比現在更高效。

DECLARE @BaseDate DATE = '2016-02-29'; 

SELECT 
    Entry_Date = DATEADD(YEAR, t.n, @BaseDate) 
FROM 
    (VALUES (-1),(-2),(-3),(-4),(-5), 
      (-6),(-7),(-8),(-9),(-10), 
      (-11),(-12),(-13),(-14),(-15)) t (n); 

結果...

Entry_Date 
---------- 
2015-02-28 
2014-02-28 
2013-02-28 
2012-02-29 
2011-02-28 
2010-02-28 
2009-02-28 
2008-02-29 
2007-02-28 
2006-02-28 
2005-02-28 
2004-02-29 
2003-02-28 
2002-02-28 
2001-02-28 

編輯:有日期的表使用時同樣的功能(我偷了約翰的表)

DECLARE @YourTable TABLE (id INT, Entry_Date DATE); 
INSERT INTO @YourTable VALUES (1, '2016-02-29'), (2, '2015-07-22'); 

SELECT 
    yt.id, 
    Entry_Date = DATEADD(YEAR, t.n, yt.Entry_Date) 
FROM 
    @YourTable yt 
    CROSS APPLY (VALUES (-1),(-2),(-3),(-4),(-5), 
         (-6),(-7),(-8),(-9),(-10), 
         (-11),(-12),(-13),(-14),(-15)) t (n); 
GO 

結果...

id   Entry_Date 
----------- ---------- 
1   2015-02-28 
1   2014-02-28 
1   2013-02-28 
1   2012-02-29 
1   2011-02-28 
1   2010-02-28 
1   2009-02-28 
1   2008-02-29 
1   2007-02-28 
1   2006-02-28 
1   2005-02-28 
1   2004-02-29 
1   2003-02-28 
1   2002-02-28 
1   2001-02-28 
2   2014-07-22 
2   2013-07-22 
2   2012-07-22 
2   2011-07-22 
2   2010-07-22 
2   2009-07-22 
2   2008-07-22 
2   2007-07-22 
2   2006-07-22 
2   2005-07-22 
2   2004-07-22 
2   2003-07-22 
2   2002-07-22 
2   2001-07-22 
2   2000-07-22