特定のレコードの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
最も簡単な方法は、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で確認できます
このクエリでは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`)