2016-12-14 86 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