我有一个包含以下列的表:
ID startdate enddate
我希望这个表的行重复次数与startdate和enddate之间的差异一样多,以及一个列,该列给出表中每个id的这两天之间的所有日期。所以,我的新表应该是这样的:
ID Date
A startdate
A startdate +1 day
A startdate +2 days (till enddate)
B startdate
B startdate + 1 day ....
请注意,我对不同的ID有不同的开始和结束日期。
我尝试了以下问题的答案,但这不起作用:
Mysql select multiple rows based on one row related date range
答案 0 :(得分:2)
这是一种方法。
这使用内联视图(别名为i
来生成0到999之间的整数值,并将其连接到您的表以生成最多1000个日期值,从每个行的startdate开始到enddate。
可以使用相同的模式轻松扩展内联视图i
以生成10,000或100,000行。
这假定startdate
和enddate
列是数据类型DATE
。 (或DATETIME
或TIMESTAMP
或可以隐式转换为有效DATE
值的数据类型。
SELECT t.id
, t.startdate + INTERVAL i.i DAY AS `Date`
FROM ( SELECT d3.n*100 + d2.n*10 + d1.n AS i
FROM ( SELECT 0 AS n
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) d1
CROSS
JOIN ( SELECT 0 AS n
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) d2
CROSS
JOIN ( SELECT 0 AS n
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) d3
) i
JOIN mytable t
ON i.i <= DATEDIFF(t.enddate,t.startdate)
答案 1 :(得分:1)
您需要一个数字表...创建一个临时表或虚拟表,其中包含数字1到X(X是两个日期之间可能存在的最大差异)
然后使用日期差异
加入该表我担心我是SQL Server,因此不确定在Windows中,datediff函数的工作方式是否相同,但你应该明白这一点。
SELECT
DateTable.Id,
DATEADD(dd, NumbersTable.Number, DateTable.StartDate)
FROM
DateTable
INNER JOIN
NumbersTable
ON
DATEADD(dd, NumbersTable.Number, DateTable.StartDate) <= DateTable.EndDate
ORDER BY
DateTable.Id,
DATEADD(dd, NumbersTable.Number, DateTable.StartDate)
答案 2 :(得分:0)
我知道回答很晚了 但是使用递归CTE还是一个答案
with recursive cte ( id, startdate) as
(
select id,startdate from test t1
union all
select t2.id,(c.startdate + interval '1 day')::date
from test t2
join cte c on c.id=t2.id and (c.startdate + interval '1 day')::date<=t2.enddate
)
select id,startdate as date from cte
order by id, startdate
特定于PostgreSQL,但它应该可以在其他关系数据库中使用,而Date函数只需稍作更改即可。