イベントデータを含む「events」という名前のMySQLテーブルがあります。重要な列は「開始」と「終了」で、イベントの開始時と終了時を表す文字列(YYYY-MM-DD)が含まれます。
ある期間内のすべてのアクティブなイベントのレコードを取得したい。
イベント:
------------------------------ ID |開始| END | ------------------------------ 1 | 2013-06-14 | 2013-06-14 | 2 | 2013-06-15 | 2013-08-21 | 3 | 2013-06-22 | 2013-06-25 | 4 | 2013-07-01 | 2013-07-10 | 5 | 2013-07-30 | 2013-07-31 | ------------------------------
リクエスト/検索:
例:2013-06-13から2013-07-22までのすべてのイベント:#1、#3、#4 SELECT FROM FROM FROM WHERE WHERE BETWEEN '2013-06-13' AND 「2013-07-22」:#1、#2、#3、#4 「2013-06-13」と「2013-07-22」の間に終了するイベントからIDを選択#3、#4 ====>交差:#1、#3、#4
例:2013-06-14から2013-06-14までのすべてのイベント: SELECT FROM FROM WHERE WHERE BETWEEN '2013-06-14' AND '2013-06-14': #1 '2013-06-14'と '2013-06-14'の間で終了するイベントからIDを選択:#1 ====>交差:#1
多くのクエリを試しましたが、正確なSQLクエリを取得できませんでした。
あなたはそれを行う方法を知りませんか?助言がありますか?
ありがとう!
私が正しく理解していれば、単一のクエリを使用しようとしているので、WHERE
句に日付検索トグルをマージすることができると思います
SELECT id
FROM events
WHERE start BETWEEN '2013-06-13' AND '2013-07-22'
AND end BETWEEN '2013-06-13' AND '2013-07-22'
またはさらに簡単に両方の列を使用して検索時間フィルターを設定できます
SELECT id
FROM events
WHERE start >= '2013-07-22' AND end <= '2013-06-13'
スコープ内で開始および終了するイベントが必要です。しかし、それだけではありません。スコープ内で開始するイベントと、スコープ内で終了するイベントも必要です。ただし、スコープの前で開始し、スコープの後に終了するイベントも必要なので、まだそこにいません。
簡略化:
ポイント2はポイント3のクエリにも一致するレコードを生成するため、ポイント1と3のみが必要になります。
したがって、SQLは次のようになります。
SELECT * FROM events
WHERE start BETWEEN '2014-09-01' AND '2014-10-13'
OR '2014-09-01' BETWEEN start AND end
ここにたくさんの良い答えがありますが、私はこれが誰かを助けると思います
select id from campaign where ( NOW() BETWEEN start_date AND end_date)
_SELECT id
FROM events
WHERE start <= '2013-07-22'
AND end >= '2013-06-13';
_
または、優先順位がわからない場合は、MIN()
およびMAX()
を使用します。
期間内のアクティブなイベントは、イベントの少なくとも1日が期間内に収まることを意味すると想定しています。これは単純な「重複する日付を見つける」問題であり、一般的な解決策があります。
-- [@d1, @d2] is the date range to check against
SELECT * FROM events WHERE @d2 >= start AND end >= @d1
いくつかのテスト:
-- list of events
SELECT * FROM events;
+------+------------+------------+
| id | start | end |
+------+------------+------------+
| 1 | 2013-06-14 | 2013-06-14 |
| 2 | 2013-06-15 | 2013-08-21 |
| 3 | 2013-06-22 | 2013-06-25 |
| 4 | 2013-07-01 | 2013-07-10 |
| 5 | 2013-07-30 | 2013-07-31 |
+------+------------+------------+
-- events between [2013-06-01, 2013-06-15]
SELECT * FROM events WHERE '2013-06-15' >= start AND end >= '2013-06-01';
+------+------------+------------+
| id | start | end |
+------+------------+------------+
| 1 | 2013-06-14 | 2013-06-14 |
| 2 | 2013-06-15 | 2013-08-21 |
+------+------------+------------+
-- events between [2013-06-16, 2013-06-30]
SELECT * FROM events WHERE '2013-06-30' >= start AND end >= '2013-06-16';
+------+------------+------------+
| id | start | end |
+------+------------+------------+
| 2 | 2013-06-15 | 2013-08-21 |
| 3 | 2013-06-22 | 2013-06-25 |
+------+------------+------------+
-- events between [2013-07-01, 2013-07-01]
SELECT * FROM events WHERE '2013-07-01' >= start AND end >= '2013-07-01';
+------+------------+------------+
| id | start | end |
+------+------------+------------+
| 2 | 2013-06-15 | 2013-08-21 |
| 4 | 2013-07-01 | 2013-07-10 |
+------+------------+------------+
-- events between [2013-07-11, 2013-07-29]
SELECT * FROM events WHERE '2013-07-29' >= start AND end >= '2013-07-11';
+------+------------+------------+
| id | start | end |
+------+------------+------------+
| 2 | 2013-06-15 | 2013-08-21 |
+------+------------+------------+
SELECT *
FROM events
WHERE start <= '2013-07-22' OR end >= '2013-06-13'
INTERSECTオプションを使用する場合、SQLは次のとおりです。
(SELECT id FROM events WHERE start BETWEEN '2013-06-13' AND '2013-07-22')
INTERSECT
(SELECT id FROM events WHERE end BETWEEN '2013-06-13' AND '2013-07-22')
これを試して
SELECT id FROM events WHERE start BETWEEN '2013-06-13' AND '2013-07-22'
AND end BETWEEN '2013-06-13' AND '2013-07-22'
出力:
ID
1
3
4
編集:私はフィルターをたくさん絞った。期間内に何かが本当に収まることを確認する前に、頭を包むことはできませんでした。これは次のとおりです。期間の終了前の開始日、および期間の開始後の終了日
私のオフィスの誰かの助けを借りて、フィルターに全員を含める方法を見つけたと思います。問題の期間中に学生がアクティブであると見なされるシナリオは5つあります。
1)学生は期間中に開始および終了しました。
2)学生は期間中に開始し、終了しました。
3)学生は期間の前に始まり、期間の後に終了しました。
4)学生は期間中に開始し、期間後に終了しました。
5)学生は期間中に開始し、まだアクティブです(終了日はまだありません)
これらの基準を考慮すると、学生は期間の日付の間、期間の日付の後、または終了日がないために終了することができるため、実際にステートメントをいくつかのグループにまとめることができます。
1)学生は期間中に終了し、[学生はOR during]の前に開始します]
2)学生は一定期間後に終了し、[学生はOR during]の前に開始します]
3)学生はまだ終了しておらず、[学生はOR during]の前に開始します]
(
(
student_programs.END_DATE >= '07/01/2017 00:0:0'
OR
student_programs.END_DATE Is Null
)
AND
student_programs.START_DATE <= '06/30/2018 23:59:59'
)
これは最終的にすべてのベースをカバーし、開始日と終了日のみがある期間中に学生、イベント、または何かがアクティブになるすべてのシナリオを含むと思います。どうか、私が何かを見逃していることをtoしないでください。私は他の答えがまだすべてを手に入れたとは思わないので、他の人がこれを使用できるように、これが完璧であることを望みます。