查找日期后可变天数的所有日期

时间:2020-04-29 20:26:31

标签: sql loops tsql date

我在一个表中有一个日期列表。对于此示例,每个月的第一天。我们将其称为表时间段,其列为endTime

endTime
1-1-2019
2-1-2019
3-1-2019
4-1-2019

我想找到所有日期x列表中每个日期之后的天数。假设x =4。那么列表应该是:

1-1-2019
1-2-2019
1-3-2019
1-4-2019
2-1-2019
2-2-2019
2-3-2019
2-4-2019
3-1-2019
3-2-2019
3-3-2019
3-4-2019
4-1-2019
4-2-2019
4-3-2019
4-4-2019

我已经找到了解决方案,可以找到日期之间的所有日期,但是当我尝试将其与日期列表一起使用时,会不断收到“子查询返回的值超过1个” 错误。

这是我尝试过但不起作用的示例

declare @days DECIMAL = 4
declare @StartDate date = (select convert(varchar, DATEADD(Day, +0, endTime),101) from timeperiod
declare @EndDate date = (select convert(varchar, DATEADD(Day, +@days, endTime),101) from timeperiod;

;WITH cte AS (
    SELECT @StartDate AS myDate
    UNION ALL
    SELECT DATEADD(day,1,myDate) as myDate
    FROM cte
    WHERE DATEADD(day,1,myDate) <=  @EndDate
)
SELECT myDate
FROM cte
OPTION (MAXRECURSION 0)

2 个答案:

答案 0 :(得分:2)

这是一个行生成器,它生成5到0到4行:

$query = "SELECT * FROM bands WHERE band_id = '".$band_id."' and ( bandm1 = '".$user_name."' OR bandm2 = '".$user_name."' OR bandm3 = '".$user_name."' OR bandm4 = '".$user_name."' )";

在这里,我们将其与具有月初的现有表联接,并使用DATEADD将WITH rg AS ( SELECT 0 AS rn UNION ALL SELECT rg.rn + 1 FROM rg WHERE rn < 4 ) 天数(介于0和4之间)添加到endPeriod。交叉联接导致timePeriod中的行各重复5次:

rn

当您说“日期之后的天X天,说x = 4”时,我并不清楚,如果我说某天是2000年1月1日,那么该日期之后的4天就是5 -2000年1月

如果只希望Jan的1,2,3和4成为行生成器SELECT DATEADD(DAY, rg.rn, timePeriod.endTime) as fakeEndTime FROM rg CROSS JOIN timePeriod 而不是< 3

答案 1 :(得分:0)

已经对Caius Jard的递归cte进行了+1。

这是使用临时计数表与CROSS JOIN配合使用的另一种选择

示例

Declare @YourTable Table ([endTime] date)
Insert Into @YourTable Values 
 ('1-1-2019')
,('2-1-2019')
,('3-1-2019')
,('4-1-2019')

Select NewDate = dateadd(DAY,N-1,EndTime)
 From @YourTable A
 Cross Join ( 
                Select Top (4) N=row_number() over (order by (select null)) 
                 From  master..spt_values N1
            ) B

返回

NewDate
2019-01-01
2019-01-02
2019-01-03
2019-01-04
2019-02-01
2019-02-02
2019-02-03
2019-02-04
2019-03-01
2019-03-02
2019-03-03
2019-03-04
2019-04-01
2019-04-02
2019-04-03
2019-04-04