17

我有一个名为“事件”的 MySQL 表,其中包含事件数据。重要的列是“开始”和“结束”,它们包含字符串 (YYYY-MM-DD) 来表示事件的开始和结束时间。

我想获取一段时间内所有活动事件的记录。

事件:

------------------------------
身份证 | 开始 | 结束 |
------------------------------
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

从“2013-06-13”和“2013-07-22”之间开始的事件中选择 id:#1、#2、#3、#4
从“2013-06-13”和“2013-07-22”之间结束的事件中选择 id:#1、#3、#4
====> 相交:#1、#3、#4
示例: 2013-06-14 和 2013-06-14 之间的所有事件:

从“2013-06-14”和“2013-06-14”之间开始的事件中选择 id:#1
从“2013-06-14”和“2013-06-14”之间结束的事件中选择 id:#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 在 startdate 和 enddate 之间的事件

因为第 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 回答
14

这里有很多很好的答案,但我认为这会对某人有所帮助

select id  from campaign where ( NOW() BETWEEN start_date AND end_date) 
于 2017-05-10T05:24:54.010 回答
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 回答
3
SELECT *
FROM events 
WHERE endDate >= @startDate AND startDate <= @endDate

有关说明,请参阅此图:

在此处输入图像描述

  • 假设样本数据是[startDate: 2020-10-01, endDate: 2020-20-01]
  • 用户提供@startDate@endDate搜索
  • 对于重叠,有 4 个场景和 1 个变化(红色/栗色线)
  • 对于没有重叠,只有 2 个场景(绿线)

因此,为了通过提供开始日期和结束日期来获得重叠日期,endDate 必须大于 @startDate 并且 startDate 必须小于 @endDate。

于 2020-10-20T11:00:36.507 回答
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

如果你想使用 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') 
于 2015-02-04T18:28:26.813 回答
0

如果有人正在搜索当前日期位于 Microsoft SQL 中的两个期间(开始/结束日期)之间的情况,请在下面找到

select id from campaign where (getdate() BETWEEN start_date AND end_date) 
于 2021-12-06T10:30:59.260 回答
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 回答
0

编辑:我已经挤压了很多过滤器。在如何确保某些东西真正适合该时间段之前,我无法绕开它。就是这样:开始日期在时间段结束之前,结束日期在时间段开始之后

在我办公室某人的帮助下,我想我们已经想出了如何将每个人都包括在过滤器中。有 5 种情况下,学生会在相关时间段内被视为活跃:

1) 学生在该时间段内开始和结束。

2) 学生在该时间段之前开始并在该时间段内结束。

3) 学生在时间段之前开始并在时间段之后结束。

4) 学生在时间段内开始,在时间段后结束。

5) 学生在该时间段内开始并且仍然处于活动状态(还没有结束日期)

鉴于这些标准,我们实际上可以将语句压缩为几组,因为学生只能在期间日期之间结束,在期间日期之后,或者他们没有结束日期:

1) 学生在该时间段内结束并且 [学生在此之前或期间开始]

2) 学生在该时间段之后结束并且 [学生在此之前或期间开始]

3) 学生尚未完成并且 [学生在之前或期间开始]

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