我正在嘗試獲取兩個日期之間給定間隔的所有 DateRanges 的串列。
例如,如果我有日期 2015-04-01 和 2015-06-20 并且當間隔為 20 時,結果應該是
DateFrom DateTo
------------------------
2015-04-01 2015-04-21
2015-04-22 2015-05-12
2015-05-13 2015-06-02
2015-06-03 2015-06-20
-------------------
這是我正在嘗試的查詢
DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
DECLARE @Interval int = 20
SET @StartDateTime = '2015-04-01'
SET @EndDateTime = '2015-06-20';
WITH DateRange(DateStart,DateEnd) AS
(
SELECT @StartDateTime, DATEADD(d,@Interval,@StartDateTime)
UNION ALL
SELECT DATEADD(d,1,DateEnd), DATEADD(d,@Interval,DateEnd)
FROM DateRange
WHERE DateEnd <= @EndDateTime
)
SELECT CAST(DateStart as date) DateStart
, CAST(DateEnd as Date) DateEnd
FROM DateRange
OPTION (MAXRECURSION 0)
GO
它回傳以下結果,這與我上面的預期結果不完全相同
DateStart DateEnd
2015-04-01 2015-04-21
2015-04-22 2015-05-11
2015-05-12 2015-05-31
2015-06-01 2015-06-20
2015-06-21 2015-07-10
如您所見,在給定日期之外還有一個額外的行,并且第二行之間的間隔是 19 天,而不是 20 天。我理解它,因為我在union all之后的第一個欄位中添加了一天
請幫助我解決此查詢,或者建議一種更好的方法來實作相同的查詢。
uj5u.com熱心網友回復:
對遞回 cte 的更改應該是
用于CASE檢查結束日期。如果它大于所需的結束日期,請將其設定為@EndDateTime
條件也WHERE應該是
WHERE DateEnd < @EndDateTime
WITH DateRange(DateStart,DateEnd) AS
(
SELECT @StartDateTime,DATEADD(day, @Interval, @StartDateTime)
UNION ALL
SELECT dateadd(day, 1, DateEnd),
case when DATEADD(day, @Interval 1, DateEnd) <= @EndDateTime
then DATEADD(day, @Interval 1, DateEnd)
else @EndDateTime
end
FROM DateRange
WHERE DateEnd < @EndDateTime
)
uj5u.com熱心網友回復:
如果你想每隔@Interval一天開始間隔
DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
declare @Interval int=20
SET @StartDateTime = '2015-04-01'
SET @EndDateTime = '2015-06-20';
WITH DateRange(DateStart,DateEnd) AS
(
SELECT @StartDateTime, DATEADD(d, @Interval - 1, @StartDateTime)
UNION ALL
SELECT dateadd(d, @Interval, DateStart),DATEADD(d, @Interval, DateEnd)
FROM DateRange
WHERE DateEnd < @EndDateTime - 1
)
SELECT cast(DateStart as date) DateStart,cast(DateEnd as Date) DateEnd
FROM DateRange
OPTION (MAXRECURSION 0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454759.html
上一篇:MSOLEDBSQL或MSOLEDBSQL19連接到Azure資料庫時出現超時錯誤-“從我的機器”運行良好
下一篇:嘗試使用CTE將代碼替換為名稱
