2013-10-07 54 views
2

我再一次试图解决一个MYSQL相关的问题这听起来很简单,在第一,但现在令我有些头疼。我已经阅读了大量的代码片段并进行了几天的实验,但是在寻找完美解决方案方面我还没有取得太大的成功。对多时间匹配表项的日期时间范围

我有两个表。第一个包含电话,每个电话由在第一表中的行,它具有以下三列表示:

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

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

事项标识(INT),event_start(DATETIME),event_end(DATETIME)

我想只有我的表计的条目 - 电话t能力 - 这些不在同一日期的事件表中的开始和结束之间的时间内。

我的主要问题是,有可能在事件表中的多个条目为一个日期(例如:从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.我试图找到如何在这里,所以我的帖子格式示例表数据参考,但无论是我失明或没有具体的参考。因为我已经看到了很好的格式化的示例表的数据,我知道这是可能等等,一个额外的线索,将不胜感激了很多为好。

UPDATE 我设法得到一些输出,使用LEFT JOIN而不是INNER。由于我不是MySQL专家,因此如果结果是正确的,我会手动去计数。

+0

又是怎么回事部分匹配?即当呼叫时间在event_end之前开始,但在它之后结束? (并在下一个event_start之前)?这是匹配还是不匹配? –

+0

嗨,Alma Do Mundo。谢谢你的评论。 call_time没有开始或结束,它是一个时间点,仅在呼叫开始时才表示。所以我试图将时间点与时间范围相匹配,确定这个时间点是在时间范围内还是时间范围之外。 – unit303

回答

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

秘密似乎是将日期+时间值转换为时间戳。确实美丽而简单。令人敬畏的小提琴例子,非常感谢努力伴侣。 – unit303

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所有记录不与任何事件开始和enddates在event_table之间下降。如果您认为合适,请添加您自己的where-criteria和/或count()函数。

+0

经过试验这个查询后,它看起来很有希望。我们可能会在这里得到答案。我会在多一点评估后再报告。已经有很高的评价了。 – unit303

+0

很高兴听到它。如果您希望我进一步阐述此方法,请告诉我,或者查看关于MySQL EXISTS的文档:http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries .html – Dan

+0

@all:我已经将查询实现到了我的应用程序中,并且它看起来能够完美地工作。再次感谢所有有关各方,这个问题可以认为是答案。不确定一个mod是否可以相应标记它。如果可以的话,我会投两个建议。 – unit303