MySQL查询选择开始/结束日期之间的事件

Gui*_*ara 11 mysql sql date date-range

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

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

事件:

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

请求/搜索:

Example: All events between 2013-06-13 and 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
====> intersect : #1, #3, #4
Example: All events between 2013-06-14 and 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
====> intersect : #1

我尝试了很多查询仍然无法获得确切的SQL查询.

你不知道怎么做吗?有什么建议?

谢谢!

Fab*_*bio 17

如果我理解正确您尝试使用单个查询,我认为您可以将日期搜索合并到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'
Run Code Online (Sandbox Code Playgroud)

或者更简单地说,您可以使用两列来设置搜索时间过滤器

SELECT id 
FROM events 
WHERE start >= '2013-07-22' AND end <= '2013-06-13'
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不包括正在进行的事件.IMO正在进行的事件可能是日期范围之前或之后开始的,应该是"一段时间内所有活动事件"的一部分 (4认同)

Pet*_*oot 14

您需要在范围内开始和结束的事件.但这并非全部:您还需要在范围内开始的事件以及在范围内结束的事件.但是你仍然不在那里,因为你也想要在范围之前开始并在范围之后结束的事件.

简化:

  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
Run Code Online (Sandbox Code Playgroud)


Sau*_*tel 8

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

select id  from campaign where ( NOW() BETWEEN start_date AND end_date) 
Run Code Online (Sandbox Code Playgroud)


Oli*_*and 5

SELECT id
FROM events
WHERE start <= '2013-07-22'
AND end >= '2013-06-13';
Run Code Online (Sandbox Code Playgroud)

或者MIN()MAX()如果您不知道优先级,请使用和。

  • @Guicara,这实际上是此处列出的唯一正确答案之一。让我解释。假设一个事件开始于 2013-01-01,结束于 2013-12-31。此事件是否应包含在查询中?我相信是的,它应该是因为它是您选择的范围内正在进行的活动事件。除非您的意思是“一个时间段内的所有活动事件”作为仅在日期范围内开始和结束的事件。我最近在脚本中遇到了这个“错误”,因为我使用了其他答案之一。我相信您希望事件在结束日期之前开始并在开始日期之后结束。 (2认同)

小智 5

SELECT *
FROM events 
WHERE endDate >= @startDate AND startDate <= @endDate
Run Code Online (Sandbox Code Playgroud)

有关解释请参考此图:

在此输入图像描述

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

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

  • 一个解释会很好。另外你为什么使用“nolock”,它与问题有何关系? (2认同)