我在一个表中有一个日期列表。对于此示例,每个月的第一天。我们将其称为表时间段,其列为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)
答案 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