我出生于1978/12/22
我想要一个查询(在CTE!中)显示我所有的生日(datepart day = 22)
declare @t0 datetime = '1978/12/22';
declare @t1 datetime = getdate();
with CTEE (val,day1)
AS
(
SELECT @t0,DATEPART(day,@t0)
UNION all
SELECT DATEADD(day,1,val) , DATEPART(day,day1) from ctee where( DATEADD(day,1,val) <=@t1) and DATEPART(day,day1)=22
)
select val,day1 from CTEE OPTION (MAXRECURSION 20000)
这怎么回事我一行(为什么 ???)
If I remove
and DATEPART(day,day1)=22
所以它给了我所有活着的日子。
我找到的解决方案是:
declare @t0 datetime = '1978/12/22';
declare @t1 datetime = getdate();
with CTEE (val,day1)
AS
(
SELECT @t0,DATEPART(day,@t0)
UNION all
SELECT DATEADD(day,1,val) , DATEPART(day,day1) from ctee where( DATEADD(day,1,val) <=@t1)
)
select val,day1 from CTEE where day1=22 OPTION (MAXRECURSION 20000)
但我的问题是为什么在第一个查询中它不起作用?
答案 0 :(得分:0)
因为第二条记录是1978-12-23
。
这不符合DATEPART(day,day1)=22
条件,因此递归步骤不返回任何结果,这将终止递归,如SQL Server Books Online
终止检查是隐含的;没有行时递归停止 从上一次调用返回。