3

次の列を持つテーブルがあります。

ID startdate enddate

このテーブルの行は、開始日と終了日の差と同じ回数だけ繰り返され、テーブル内の各IDについてこれら2日間のすべての日付を示す列が必要です。したがって、私の新しいテーブルは次のようになります。

ID Date

A startdate
A startdate +1 day
A startdate +2 days (till enddate)
B startdate
B startdate + 1 day ....

IDごとに開始日と終了日が異なることに注意してください。

次の質問の答えを試しましたが、うまくいきません。

Mysqlは、1つの行に関連する日付範囲に基づいて複数の行を選択します

4

3 に答える 3

4

これが1つのアプローチです。

これはインラインビューを使用します(i0から999までの整数値を生成するためにエイリアスされ、テーブルに結合されて、各行の開始日から終了日まで、最大1000の日付値を生成します。

インラインビュー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)
于 2013-02-08T22:56:03.433 に答える
2

数値テーブルが必要です...1からXまでの数値を含む一時テーブルまたはダミーテーブルを作成します(Xは2つの日付の可能な最大差です)

次に、datediffを使用してそのテーブルに結合します

私はSQLServerであるため、datediff関数がmysqlでも同じように機能するかどうかはわかりませんが、理解しておく必要があります。

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)
于 2013-02-08T22:31:25.847 に答える
2

答えるのが非常に遅いことはわかっていますが、再帰cteを使用してもう1つ答えます

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関数を少し変更するだけで他のリレーショナルデータベースでも機能するはずです。

于 2020-05-24T09:32:44.133 に答える