web-dev-qa-db-ja.com

テーブル内の複数の2つの日付の間のすべての日付を表示するにはどうすればよいですか?

特定のレコードの2つの日付の間のすべての日付を表示したい

そしてこれはテーブルです:

ID Start_Date  End_Date
-------------------------
1  2013-01-14  2013-01-18
2  2013-02-01  2013-02-04

そして、今から日付までのすべての日付を取得したいと思います。

期待される出力

ID Date
-------------
1  2013-01-14
1  2013-01-15
1  2013-01-16
1  2013-01-17
1  2013-01-18
2  2013-02-01
2  2013-02-02
2  2013-02-03
2  2013-02-04

追加のテーブルを作成せずに、そのためのクエリを作成するようにガイドしてください。

私はすでにこの次のクエリを試しました

select * from 
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
 (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between '2012-02-10' and '2012-02-15'

単一のレコードでは正常に機能します。テーブルからすべての日付間隔を取得したい

更新済み

私は一日中6個の椅子を持っています。したがって、あるユーザーが2013-01-14から2013-01-18で3文字を予約し、別のユーザーが2013-01-17から2013-01-20で2文字を予約します。だから、以下に示す私の予想される出力。

ID Date        Available
------------------------
1  2013-01-14          3
1  2013-01-15          3
1  2013-01-16          3
1  2013-01-17          5 
1  2013-01-18          5
1  2013-01-19          2
1  2013-01-20          2 
1  2013-01-21          2
5
Nathan Srivi

最も簡単な方法は、calendarテーブルを以下のように定義することです。

CREATE TABLE calendar
(
    a_day date PRIMARY KEY
) ;

...関連する日付allで埋められます(つまり、1990-1-1から2100-12-31までのすべての日)。簡単にするために、2013年のみを記入します。

INSERT INTO 
     calendar (a_day)
VALUES
    ('2013-01-01'),
    ('2013-01-02'),
    ('2013-01-03'),
    ('2013-01-04'),
    ('2013-01-05'),
    -- everything up to
    ('2013-12-31') ;

この時点で、2つのテーブルを持つJOINを作成できます。結合条件が等価ではなく、範囲条件の場合:

SELECT
     t.id, c.a_day
FROM
     t
     JOIN calendar c ON c.a_day BETWEEN t.start_date AND t.end_date 
ORDER BY
     t.id, c.a_day ;

...そして得る

 id | a_day 
-:| :--------- 
 1 | 2013-01-14 
 1 | 2013-01-15 
 1 | 2013-01-16 
 1 | 2013-01-17 
 1 | 2013-01-18 
 2 | 2013-02-01 
 2 | 2013-02-02 
 2 | 2013-02-03 
 2 | 2013-02-04 

すべての設定はdbfiddle hereで確認できます

3
joanolo

このクエリではdate関数を使用しています。列created_atには日付と時刻の両方が含まれます。

SELECT date(`created_at`)
FROM table_name
WHERE date(`created_at`) BETWEEN '2018-03-08' AND '2018-03-22'
GROUP BY DATE(`created_at`)
0
Abhishek Kumar