将日期时间条目与具有多个时间范围的表匹配

时间:2013-10-07 10:39:36

标签: mysql datetime date-range

我再一次尝试解决一个MYSQL相关的问题,起初听起来很简单,但现在让我有些头疼。我已经阅读了很多片段并进行了几天的实验,但是我在寻找完美解决方案方面没有取得多大成功。

我有两张桌子。第一个包含电话呼叫,每个电话呼叫由第一个表中的一行表示,其中包含以下三列:

p_key(INT),call_date(DATE),call_time(TIME)

我的第二个表包含特定事件,还有三列:

event_id(INT),event_start(DATETIME),event_end(DATETIME)

我想只计算我的第一个表中的条目 - 调用表 - 它们不属于同一日期事件表的开始和结束之间的时间。

我的主要问题是,事件表中可能有多个条目用于单个日期(例如:0800 - 1000的事件和同一天的1400到1600的另一个事件)。否则我可以简单地使用BETWEEN语法。

我想这可能会产生这种影响:

SELECT
SUM(
   CASE WHEN t1.p_key != 0  
   THEN 1 ELSE 0 END
) AS brt,
SUM(
   CASE WHEN t1.p_key != 0  
    AND t1.call_time NOT BETWEEN TIME(t2.event_start) AND TIME(t2.event_end)
   THEN 1 ELSE 0 END
) AS net


FROM call_table t1 INNER JOIN event_table t2
ON t1.call_date = DATE(t2.event_start)
WHERE t1.call_date >= '2013-09-01'
AND t1.call_date <= '2013-09-30'
GROUP BY DAY(t1.call_date)

不幸的是,这个查询没有返回任何结果。

有人能指出我的方向吗?

P.S。我试图在SO上找到关于如何格式化我的帖子中的样本表数据的参考,但我要么是盲目的,要么没有具体的参考。由于我已经看到格式良好的示例表数据,我知道它是可能的,所以一个额外的线索也将受到很多赞赏。

更新 我设法得到一些输出,使用LEFT JOIN而不是INNER。由于我不是MySQL专家,如果结果正确,我会去手工计算。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SELECT *
FROM call_table t1
WHERE NOT EXISTS (
    SELECT * FROM event_table t2
    WHERE TIMESTAMP(t1.date, t1.time) BETWEEN t2.event_start AND t2.event_end)
)

这应该为您提供call_table中的所有记录,这些记录不在event_table中的任何事件开始和结束之间。根据需要添加您自己的where-criteria和/或count()函数。

答案 1 :(得分:1)

您应该查询

SELECT 
  TIMESTAMP(call_date, call_time)
FROM 
  calls 
  LEFT JOIN events 
    ON TIMESTAMP(call_date, call_time)>event_start 
    AND timestamp(call_date, call_time)<event_end 
WHERE 
  event_start IS NULL

- 见fiddle

对于计数结果,只需执行

SELECT 
  COUNT(calls.id)
FROM 
  calls 
  LEFT JOIN events 
    ON TIMESTAMP(call_date, call_time)>event_start 
    AND timestamp(call_date, call_time)<event_end 
WHERE 
  event_start IS NULL