मेरे पास यह प्रश्न है जो मुझे पिछले 15 वर्षों में से प्रत्येक के लिए एक निश्चित तिथि देता है। जब मेरी आरंभ तिथि 29 फरवरी है तो यह वर्ष 2012, 2008 और 2004 के लिए 29 नहीं लौटाती है। उन वर्षों के लिए 29 को वापस करने के लिए मेरे पास यह प्रश्न कैसे हो सकता है?

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

जबकि मैं इसे प्राप्त करना चाहता हूं:

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
3
JulGreen 31 अगस्त 2017, 21:03

3 जवाब

सबसे बढ़िया उत्तर

शायद डेट एड-हॉक टैली टेबल के साथ संगीत कार्यक्रम में जोड़ें

उदाहरण

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

1
John Cappelletti 31 अगस्त 2017, 21:31

इस तरह टूर क्वेरी को फिर से लिखें... हुप्स के माध्यम से कूदे बिना न केवल लीप वर्षों को संभालेगा, यह परिमाण के आदेश आपके पास वर्तमान की तुलना में अधिक कुशल हैं।

 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
0
Jason A. Long 2 सितंबर 2017, 02:34