17

イベント データを含む「events」という名前の MySQL テーブルがあります。重要な列は、イベントの開始と終了を表す文字列 (YYYY-MM-DD) を含む「開始」と「終了」です。

ある期間にアクティブなすべてのイベントのレコードを取得したいと考えています。

イベント:

------------------------------
ID | スタート | 終了 |
------------------------------
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 id FROM events WHERE start BETWEEN '2013-06-13' AND '2013-07-22' : #1, #2, #3, #4
SELECT id FROM events WHERE end BETWEEN '2013-06-13' AND '2013-07-22' : #1, #3, #4
====> 交差 : #1, #3, #4
例: 2013-06-14 から 2013-06-14 までのすべてのイベント:

SELECT id FROM events WHERE start BETWEEN '2013-06-14' AND '2013-06-14' : #1
SELECT id FROM events WHERE end BETWEEN '2013-06-14' AND '2013-06-14' : #1
====> 交差 : #1

多くのクエリを試しましたが、正確な SQL クエリを取得できません。

その方法がわかりませんか?助言がありますか?

ありがとう!

4

11 に答える 11

24

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'
于 2013-06-09T21:01:20.007 に答える
21

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

簡略化:

  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
于 2014-09-25T09:35:39.923 に答える
10
SELECT id
FROM events
WHERE start <= '2013-07-22'
AND end >= '2013-06-13';

または、優先順位がわからない場合はMIN()and を使用します。MAX()

于 2013-06-09T21:01:08.927 に答える
3
SELECT * 
FROM events 
WHERE start <= '2013-07-22' OR end >= '2013-06-13'
于 2013-06-09T21:00:38.147 に答える
0

これを試して

    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
于 2013-06-09T21:00:01.713 に答える
0

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

私のオフィスの誰かの助けを借りて、全員をフィルターに含める方法を見つけたと思います。問題の期間中に生徒がアクティブであると見なされる 5 つのシナリオがあります。

1) 学生は期間中に開始および終了しました。

2) 学生は、時間帯の前に開始し、時間帯に終了しました。

3) 学生は時間帯の前に開始し、時間帯の後に終了しました。

4) 学生は期間中に開始し、期間後に終了しました。

5) 学生は期間中に開始し、まだアクティブです (終了日はまだありません)

これらの基準が与えられると、学生は期間の日付の間、期間の日付の後、または終了日がないため、実際にはステートメントをいくつかのグループにまとめることができます。

1) 学生は期間中に終了し、かつ [学生は期間前または期間中に開始]

2) 学生は期間後に終了します AND [学生は期間前または期間中に開始します]

3) 生徒はまだ終わっていません AND [生徒は開始前または開始中]

   (
        (
         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'
   )

これは最終的にすべてのベースをカバーし、開始日と終了日しかない期間中に学生、イベント、または何かがアクティブであるすべてのシナリオを含むと思います. 遠慮なく、何か足りないと言ってください。他の回答がまだすべて正しくなっているとは思わないので、他の人がこれを使用できるようにこれを完璧にしたいと思っています。

于 2018-10-23T14:53:15.440 に答える
0

PHP および phpMyAdmin で

$tb = tableDataName; //Table name
$now = date('Y-m-d'); //Current date

//start and end is the fields of tabla with date format value (yyyy-m-d)

$query = "SELECT * FROM $tb WHERE start <= '".$now."' AND end >= '".$now."'";
于 2020-07-07T15:40:02.680 に答える