sql - Is that possible to write the below query using CTE recursion? -
create table #temp (date date) declare @x date set @x = '2016-7-01' declare @y date set @y = cast (getdate() date) while(@x<=@y) begin if (datename(weekday,@x) = 'sunday') insert #temp values (@x) set @x = cast(((cast(@x datetime))+1)as date) continue end select * #temp drop table #temp
is possible write above query using cte recursion?
you can use cte create numbers table. can use numbers table dates so:
declare @startdate datetime = '2016-07-01' declare @enddate datetime = '2016-08-29' ;with n0 (select 1 n union select 1) ,n1 (select 1 n n0 t1, n0 t2) ,n2 (select 1 n n1 t1, n1 t2) ,n3 (select 1 n n2 t1, n2 t2) ,n4 (select 1 n n3 t1, n3 t2) ,nums (select row_number() on (order (select 1)) num n4) select dateadd(day,num-1,@startdate) thedate nums num <= datediff(day,@startdate,@enddate) + 1 , datename(weekday, dateadd(day,num-1,@startdate)) = 'sunday'
each table (n0
nums
) multiplies number of rows in previous 'table', end 65,536 rows of numbers in nums
(you can less or more adding or removing table nx
required). then, use numbers table add days start date(select dateadd(day,num-1,@startdate) thedate
) , dates returned in date range, , weekday
sunday.
also, because numbers in nums
start @ 1, use nums-1
in our select, avoid skipping on first date in our series, giving dateadd(day, 0, @startdate)
in our first row.
Comments
Post a Comment