2016-12-14 67 views
0

我试图创建基于返回每个月的前14天在给定的范围内参数的临时表的最近14天的临时表。例如:SQL - 每月

@StartDate = '20160101' 
@EndDate = '20160401' 

然后临时表应包含(日期形式)一月,二月,三月&的2016年

月的前14天这是我已经试过:

WITH cte 
    AS (SELECT @Start AS Date, 
       CASE 
        WHEN Datepart(mm, @Start) <> Datepart(mm, @Start + 1) THEN 1 
        ELSE 0 
       END AS [Last] 
     UNION ALL 
     SELECT date + 1, 
       CASE 
        WHEN Datepart(mm, date + 1) <> Datepart(mm, date + 2) THEN 1 
        ELSE 0 
       END 
     FROM cte 
     WHERE date < @End) 
SELECT * 
FROM cte 
WHERE [last] = 1 
OPTION (maxrecursion 0) 
+0

但四月的最后14天都在给定的范围之外 – Lamak

+0

这个帖子并没有真正表现出任何努力来解决你的一部分这个问题。你研究过什么,尝试过并发现不起作用? – dfundako

+0

您没有提供足够的信息来尝试帮助您... – Roberto

回答

0
--generates all days belonging to all months in the range, then takes only the 
    --last 14 days of every month - dates outside of the range, but in those 
    --actual months, can be valid to return 
    DECLARE @StartDate date = '20160125'; 
    DECLARE @EndDate date = '20160401'; 

    WITH CTE AS (SELECT DATEADD(day,1 - day(@StartDate) , @StartDate) CD 
        UNION ALL SELECT DATEADD(day, 1, CD) FROM CTE WHERE CD < dateadd(day,-1,dateadd(m,1,dateadd(day,1 - day(@ENDDATE), @ENDDATE)))) 
     select * into #temp from CTE WHERE DAY(dateadd(day, 
          -1, 
           dateadd(m, 
             1, 
             dateadd(day, 
               1 - day(cd), 
               cd 
               ) 
             ) 
          ) 
        ) - DAY(CD) < 14 
     option (maxrecursion 0); 
     select * from #temp; 
+0

非常棒!谢谢 – nerd4life

0

使用递归CTE产生在给定范围内的所有日期。

此后得到天数每月从该数字中减去一个月的一天,获得最后14天(至13 DIFF 0)各月。

declare @StartDate date = '2016-01-01'; 
declare @EndDate date = '2016-04-30'; 

With CTE as (Select @StartDate as start_date 
      UNION ALL 
      Select dateadd(dd,1,start_date) from CTE Where start_date<@EndDate) 
select start_date 
from (select *,count(*) over(partition by year(start_date),month(start_date)) days_in_month 
     from CTE 
    ) x 
where days_in_month-datepart(dd,start_date) <=13 
OPTION (MAXRECURSION 0) 

Sample Demo