Sql server 从两个日期中获取特定日期和每行之间的天数
我希望找到两个日期之间的所有日期,频率为三个月,以及间隔中的最后一天和输出中日期之间的天数 我有以下SQL: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.
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
结果是: