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

您必须涵盖三种类型的事件:

  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 回答