sql - एसक्यूएल विशिष्ट तिथि सीमा में जन्मदिन चुनें




tsql select while-loop cursor (3)

अपने सबसे बुनियादी स्तर पर, आप 100 वर्षों के लिए हर किसी के जन्मदिन की सूची बनाकर, फ़िल्टर कर सकते हैं ...

with numbers as
(
select 0 as NN
union all
select NN+1
from numbers
where NN < 100
)    
select id, dateadd(yy,NN,BirthDate) as Birthdays
from numbers
cross join @TempTable
where dateadd(yy,NN,BirthDate) between @StartDate and @EndDate

मैं निम्नलिखित है:

DECLARE @TempTable TABLE 
(
 [Id] [int],
 [FirstName] [varchar](40) NULL,
 [Birthdate] [date] NULL
);

insert into @TempTable values (1, 'A', convert(date, '05/25/2017', 101))
insert into @TempTable values (2, 'B', convert(date, '06/25/2017', 101))

मुझे क्या चाहिए जो क्वेरी है जो StartDate से EndDate तक की सभी जन्मदिनों को वापस करेगा।

यहां अधिक होने के लिए मुझे एक परिणाम के रूप में प्राप्त होने की उम्मीद है:

केस 1: यदि तिथि सीमा निर्धारित है:

DECLARE @StartDate datetime = '05/01/2017'; 
DECLARE @EndDate datetime = '07/01/2017';

क्वेरी को वापस करना चाहिए:

1 A 2017-05-25
2 B 2017-06-25

केस 2: यदि तिथि सीमा निर्धारित है:

DECLARE @StartDate datetime = '05/01/2017'; 
DECLARE @EndDate datetime = '06/01/2017';

क्वेरी को वापस करना चाहिए:

1 A 2017-05-25

केस 3: यदि तिथि सीमा निर्धारित है:

DECLARE @StartDate datetime = '05/01/2015'; 
DECLARE @EndDate datetime = '07/01/2017';

क्वेरी को वापस करना चाहिए:

1 A 2017-05-25
1 A 2016-05-25
1 A 2015-05-25
2 B 2017-06-25
2 B 2016-06-25
2 B 2015-06-25

केस 4: यदि तिथि सीमा निर्धारित है:

DECLARE @StartDate datetime = '05/01/2015'; 
DECLARE @EndDate datetime = '06/01/2017';

प्रश्न वापस करना चाहिए

1 A 2017-05-25
1 A 2016-05-25
1 A 2015-05-25
2 B 2016-06-25
2 B 2015-06-25

सबसे पहले हम दिए गए रेंज के लिए सभी तिथियां बनाते हैं। तो तर्क लागू करें

        DECLARE @StartDate datetime = '05/01/2015'; 
        DECLARE @EndDate datetime = '06/01/2017';

        ;With DateSequence  as
        (
            Select @StartDate as Bdate
            union all
            Select dateadd(day, 1, Bdate)
            from DateSequence
           where Bdate < @EndDate
        )
        Select ID,FirstName,Bdate as BirthDate from DateSequence 
        cross join @TempTable
        where Bdate between @StartDate and @EndDate and
        month(Bdate)= month(BirthDate) and day(Bdate) = day(BirthDate)
        order by ID asc , Bdate desc
        option (MaxRecursion 2000)

आउटपुट:


यदि आप परिणामों को कॉलम या चर में निर्दिष्ट कर रहे हैं, तो इसे DATE का प्रकार दें, और रूपांतरण निहित है।

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03






sql tsql select while-loop cursor