1

選択した期間に含まれるデータを取得するためのSQLクエリが必要です。期間はユーザーがカレンダーから選択する文字列です。

たとえば、ユーザーが期間「2012-07-01」から「2012-07-04 」を選択し、次のがある場合:

ID ||  start_date  ||  end_date
 1 ||  2012-07-02  || 2012-07-04
 2 ||  2012-07-06  || 2012-08-05
 3 ||  2012-07-01  || 2012-09-01
 4 ||  2012-06-25  || 2012-09-01

次のようなSQLクエリを作成する場合:

SELECT ID, start_date, end_date
FROM   TABLE
WHERE  start_date BETWEEN '2012-07-01' AND '2012-07-04'

これにより、「2012-07-01」から「2012-07-04」までのすべての行が返されます。

ID ||  start_date  ||  end_date
 1 ||  2012-07-02  || 2012-07-04
 3 ||  2012-07-01  || 2012-09-01

ただし、この期間に含まれるすべてのデータが必要なので、結果は次のようになります。

ID ||  start_date  ||  end_date
 1 ||  2012-07-02  || 2012-07-04
 3 ||  2012-07-01  || 2012-09-01
 4 ||  2012-06-25  || 2012-09-01

ID 4の行も、ユーザーが選択した期間がstart_dateとend_dateの下にあるため、結果になりたいです。

4

3 に答える 3

1

私はこれがあなたが探しているものだと思います:

SELECT ID, start_date, end_date 
FROM TABLE 
WHERE start_date <= '2012-07-01' AND
      end_date >= '2012-07-04';
于 2012-08-03T11:47:45.330 に答える
1

次の3種類のイベントをカバーする必要があります。

  1. この間隔で開始
  2. この間隔で終了
  3. インターバルの前に開始し、インターバルの後に終了します。

したがって、これを使用する必要があります。

SELECT ID, start_date, end_date
FROM   your_table
WHERE  (start_date  BETWEEN '2012-07-01' AND '2012-07-04')
   OR  (end_date    BETWEEN '2012-07-01' AND '2012-07-04')
   OR  (start_date <= '2012-07-01' AND
        end_date   >= '2012-07-04')

簡単な概要:

Interval:                S---------E
Case 1  :      ---|      :         :            NOT WANTED
Case 2  :      ----------:----|    :            WANTED
Case 3  :      ----------:---------:------      WANTED - YOUR PROBLEM
Case 4  :         |------:----|    :            WANTED
Case 5  :         |------:---------:------      WANTED
Case 6  :                :  |---|  :            WANTED
Case 7  :                :  |------:------      WANTED
Case 8  :                :         :  |---      NOT WANTED

問題のあるケースはケース3です。条件を追加することでカバーされますstart_date <= '2012-07-01' AND end_date >= '2012-07-04'

于 2012-08-03T11:48:09.347 に答える
1
SELECT ID, start_date, end_date
FROM   TABLE
WHERE  start_date BETWEEN '2012-07-01' AND '2012-07-04'

開始日でのみ選択しています。次の方法で質問できます。

(start_date between begin, end) OR
(end_date   between begin, end) OR
(start_date <= begin AND end_date >= end)

それで:

(start_date between begin, end ):範囲内で始まるすべてのイベントがあります

(end_date between begin, end):範囲内で終了するすべてのイベントがあります

(start_date <= begin AND end_date >= end):範囲内でアクティブなすべてのイベントがあります

于 2012-08-03T11:48:26.873 に答える