首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MySQL中查找与一组小时重叠的事件范围?

如何在MySQL中查找与一组小时重叠的事件范围?
EN

Stack Overflow用户
提问于 2011-10-25 05:44:09
回答 2查看 336关注 0票数 0

假设我有一个名为events的表,其中包含列

代码语言:javascript
运行
复制
INT  id
DATETIME start_time
DATETIME end_time

如何找到时间范围从start_time到end_time的任何部分都在某个小时范围内的所有行?

例如,我可能想要查找事件在8-10 of小时范围内具有某些部分的行。

就像这样

代码语言:javascript
运行
复制
select * from events where (hour(start_time) IN (20, 21, 22)) or (hour(end_time) IN (20, 21, 22))

除了在晚上8点之前开始并在晚上11点之后结束的事件之外,都可以工作

最后,它必须跨天工作,所以像23-2 (11 23 2am)这样的范围也应该有效。

不幸的是,我不能修改这个表的模式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-16 04:52:33

我设法让这项工作符合天的界限要求。它很难看,但它似乎涵盖了所有的情况。

虽然您可以编写一个存储过程来完成此任务,但在Java中更容易表达,因此:

代码语言:javascript
运行
复制
public void checkEvents (int[][] events, int startHour, int endHour)    

  final int START         = 0;
  final int END           = 1;
  final int HOURS_PER_DAY = 24;

  for (int[] event : events) {

    int start = startHour;
    int end = (endHour < startHour) ? endHour + HOURS_PER_DAY : endHour;

    int eventStart = event[START];
    int eventEnd = (event[END] < event[START]) ? event[END] + HOURS_PER_DAY : event[END];

    if (checkOverlap(result, event, start, end, eventStart, eventEnd))
    || (checkOverlap(result, event, start, end, eventStart + HOURS_PER_DAY, eventEnd + HOURS_PER_DAY))
      || (checkOverlap(result, event, start + HOURS_PER_DAY, end + HOURS_PER_DAY, eventStart, eventEnd))
       || (!checkOverlap(result, event, start + HOURS_PER_DAY, end + HOURS_PER_DAY, eventStart + HOURS_PER_DAY, eventEnd + HOURS_PER_DAY);
          System.out.println("overlapped!");
  }
}

private boolean checkOverlap(ArrayList<int[]> result, int[] event, int start, int end, int eventStart, int eventEnd) {

  if ((eventStart >= start && eventStart < end) || (eventStart < start && eventEnd > start)) {
    return true;
  }

  return false;
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-25 05:55:49

假设start_time和end_time字段是datetime字段,那么

代码语言:javascript
运行
复制
SELECT *
FROM events
WHERE (start_time <= $event_end_time) AND (end_time >= $event_start_time)

这有点违反直觉,但如果你从时间轴上来看:

A和B是你的极限栏杆。X和Y是start_time和end_time字段:

代码语言:javascript
运行
复制
         A   B
p = -----------   event falls outside the boundaries
     X Y

         A    B
q = -----------   partial overlap
     X    Y

       A   B
r = -----------   partial overlap again
        X    Y

       A   B
s = -----------  full overlap
     X       Y

      A  B
t = -----------  outside boundaries
           X Y

您对案例Q、R和S很感兴趣。您会注意到,对于这3种案例,Y总是>= A,X总是<= B

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7882362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档