如何遍历CTE中的每个值

时间:2019-07-28 03:30:58

标签: sql common-table-expression

我现在仅在查询上工作,而不在TSQL上工作。所以我想通过查询获取结果。

我想显示每个月的第一个星期一。我想出一个查询来查找CTE中一年中每个月的日期。 (所以我的CTE给出了12个日期)。

现在,我想检查每个日期并获取最近的星期一。那是我那个月的第一个星期一。

我无法遍历查询中的每个日期。

如何处理此结果集?

谢谢

with
Wk_num
as

(select 1 as n

union all

select n=n+1 
from wk_num
where n <12)


select dateadd(month,n,getdate()) from wk_num

2 个答案:

答案 0 :(得分:0)

以下是实际获取每月第一天和每月第一天的代码(这不使用任何复杂的函数,而只是简单的日期函数):

with Wk_num as
(select 1 as n
union all
select n=n+1 from wk_num where n <12)
select  dateadd(month,n,datefromparts(year(getdate()),month(getdate()),1)) as FirstDay,
        dateadd(day,iif(9-datepart(dw,dateadd(month,n,datefromparts(year(getdate()),month(getdate()),1)))>7,2-datepart(dw,dateadd(month,n,datefromparts(year(getdate()),month(getdate()),1))),9-datepart(dw,dateadd(month,n,datefromparts(year(getdate()),month(getdate()),1)))),dateadd(month,n,datefromparts(year(getdate()),month(getdate()),1))) as FirstMonday
from wk_num

答案 1 :(得分:0)

使用模运算的相对简单的方法:

with cte as (
      select convert(date, '2019-01-01') as dte
      union all
      select dateadd(month, 1, dte)
      from cte
      where dateadd(month, 1, dte) < '2020-01-01'
     )
select dte, 
       dateadd(day, (9 - datepart(weekday, dte)) % 7, dte) as first_monday
from cte;

这假设工作日数字以星期日的1开头。