根据两列中的日期范围重复行

时间:2013-02-08 22:11:41

标签: mysql date range rows repeat

我有一个包含以下列的表:

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

3 个答案:

答案 0 :(得分:2)

这是一种方法。

这使用内联视图(别名为i来生成0到999之间的整数值,并将其连接到您的表以生成最多1000个日期值,从每个行的startdate开始到enddate。

可以使用相同的模式轻松扩展内联视图i以生成10,000或100,000行。

这假定startdateenddate列是数据类型DATE。 (或DATETIMETIMESTAMP或可以隐式转换为有效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函数只需稍作更改即可。