web-dev-qa-db-ja.com

開始日と終了日の間のイベントを選択するMySQLクエリ

イベントデータを含む「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クエリを取得できませんでした。

あなたはそれを行う方法を知りませんか?助言がありますか?

ありがとう!

11
Guicara

私が正しく理解していれば、単一のクエリを使用しようとしているので、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'
17
Fabio

スコープ内で開始および終了するイベントが必要です。しかし、それだけではありません。スコープ内で開始するイベントと、スコープ内で終了するイベントも必要です。ただし、スコープの前で開始し、スコープの後に終了するイベントも必要なので、まだそこにいません。

簡略化:

  1. 開始日がスコープ内にあるイベント
  2. スコープ内に終了日があるイベント
  3. startdateとenddateの間のスコープstartdateを持つイベント

ポイント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
14
Peter de Groot

ここにたくさんの良い答えがありますが、私はこれが誰かを助けると思います

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()を使用します。

5

期間内のアクティブなイベントは、イベントの少なくとも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 |
+------+------------+------------+
2
Salman A
SELECT * 
FROM events 
WHERE start <= '2013-07-22' OR end >= '2013-06-13'
1
Philip Sheard

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') 
0
bkm

これを試して

    SELECT id FROM events WHERE start BETWEEN '2013-06-13' AND '2013-07-22' 
                          AND   end   BETWEEN '2013-06-13' AND '2013-07-22'

DEMO HERE

出力:

 ID
 1
 3
 4
0
echo_Me

編集:私はフィルターをたくさん絞った。期間内に何かが本当に収まることを確認する前に、頭を包むことはできませんでした。これは次のとおりです。期間の終了前の開始日、および期間の開始後の終了日

私のオフィスの誰かの助けを借りて、フィルターに全員を含める方法を見つけたと思います。問題の期間中に学生がアクティブであると見なされるシナリオは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しないでください。私は他の答えがまだすべてを手に入れたとは思わないので、他の人がこれを使用できるように、これが完璧であることを望みます。

0
Lord Bobbymort