Sql server 从两个日期中获取特定日期和每行之间的天数

Sql server 从两个日期中获取特定日期和每行之间的天数,sql-server,Sql Server,我希望找到两个日期之间的所有日期,频率为三个月,以及间隔中的最后一天和输出中日期之间的天数 我有以下SQL: DECLARE @StartDate date = '2019-10-21' DECLARE @EndDate date = '2020-06-25' DECLARE @Frequenc int = 3 SELECT CalendarID, MAX(c.Year), MAX(c.Month), c.DayofMonth FROM Dim_Calendar c WHERE c.

我希望找到两个日期之间的所有日期,频率为三个月,以及间隔中的最后一天和输出中日期之间的天数

我有以下SQL:

DECLARE @StartDate date = '2019-10-21'
DECLARE @EndDate date = '2020-06-25'
DECLARE @Frequenc int = 3

SELECT 
CalendarID, 
MAX(c.Year),
MAX(c.Month), 
c.DayofMonth

FROM Dim_Calendar c

WHERE c.Date BETWEEN @StartDate AND @EndDate AND c.DayofMonth = DATEPART(dd, @StartDate)

GROUP BY c.DayofMonth, c.CalendarID
我从这个查询中得到如下信息:

CalendarID | Year | Month | DayofMonth
20191021     2019   10      21
20191121     2019   11      21
20191221     2019   12      21
20200121     2020   1       21
20200221     2020   2       21
20200321     2020   3       21
20200421     2020   4       21
20200521     2020   5       21
20200621     2020   6       21
CalendarID | Year | Month | DayofMonth | DaysBetween
20191021     2019   10      21           0
20200121     2020   1       21           92
20200421     2020   4       21           91
20200625     2020   6       25           65
CalendarID | Year | Month | DayofMonth | DaysBetween
20191021     2019   10      21           0
20200121     2020   1       21           92
20200421     2020   4       21           91
20200625     2020   6       25           65
我需要得到以下信息:

CalendarID | Year | Month | DayofMonth
20191021     2019   10      21
20191121     2019   11      21
20191221     2019   12      21
20200121     2020   1       21
20200221     2020   2       21
20200321     2020   3       21
20200421     2020   4       21
20200521     2020   5       21
20200621     2020   6       21
CalendarID | Year | Month | DayofMonth | DaysBetween
20191021     2019   10      21           0
20200121     2020   1       21           92
20200421     2020   4       21           91
20200625     2020   6       25           65
CalendarID | Year | Month | DayofMonth | DaysBetween
20191021     2019   10      21           0
20200121     2020   1       21           92
20200421     2020   4       21           91
20200625     2020   6       25           65
我希望这是有意义的,并提前感谢您:-

更新

我找到了部分问题的解决办法。现在我只需要找到每行日期之间的天数:

DECLARE @StartDate date = '2019-10-21'
DECLARE @EndDate date = '2020-06-25'
DECLARE @DrawdownDate date = '2019-06-25'
DECLARE @Frequency int = 3


SELECT 
CalendarID, 
MAX(c.Year) AS Year,
MAX(c.Month) AS Month, 
c.DayofMonth AS DayofMonth

FROM Dim_Calendar c

WHERE   c.Date BETWEEN @StartDate AND @EndDate 
        AND ((c.DayofMonth = DATEPART(dd, @StartDate) 

        AND Month IN 
        (DATEPART(MM,@StartDate),
        DATEPART(MM,DATEADD(mm, @Frequency, @StartDate)), 
        DATEPART(MM,DATEADD(mm, @Frequency * 2, @StartDate)),
        DATEPART(MM,DATEADD(mm, @Frequency * 3, @StartDate)))

        ) OR c.Date = @EndDate)

GROUP BY c.DayofMonth, c.CalendarID

我在搜索后找到了答案,并使用了滞后函数。下面是我使用的代码:

DECLARE @StartDate date = '2019-10-21'
DECLARE @EndDate date = '2020-06-25'
DECLARE @DrawdownDate date = '2019-06-25'
DECLARE @Frequency int = 3


SELECT 
c.CalendarID, 
MAX(c.Year) AS Year,
MAX(c.Month) AS Month, 
c.DayofMonth AS DayofMonth, 
DATEDIFF(day, LAG(c.Date, 1) OVER (ORDER BY c.Date), c.Date) AS DateDiff


FROM Dim_Calendar c

WHERE   c.Date BETWEEN @StartDate AND @EndDate 
        AND ((c.DayofMonth = DATEPART(dd, @StartDate) 

        AND Month IN 
        (DATEPART(MM,@StartDate),
        DATEPART(MM,DATEADD(mm, @Frequency, @StartDate)), 
        DATEPART(MM,DATEADD(mm, @Frequency * 2, @StartDate)),
        DATEPART(MM,DATEADD(mm, @Frequency * 3, @StartDate)))

        ) OR c.Date = @EndDate)

GROUP BY c.DayofMonth, c.Date, c.CalendarID
结果是: