【发布时间】:2012-11-02 19:23:41
【问题描述】:
我在使用 mysql 语句计算给定时间段内一天的约会时遇到了麻烦。我有一个日历表,包括开始和结束列(类型 = DateTime)。以下语句应计算 11 月的所有约会,包括总体约会:
SELECT
COUNT('APPOINTMENTS') AS Count,
DATE(c.StartingDate) AS Datum
FROM t_calendar c
WHERE
c.GUID = 'blalblabla' AND
((DATE(c.StartingDate) <= DATE('2012-11-01 00:00:00')) AND (DATE(c.EndingDate) >= DATE('2012-11-30 23:59:59'))) OR
((DATE(c.StartingDate) >= DATE('2012-11-01 00:00:00')) AND (DATE(c.EndingDate) <= DATE('2012-11-30 23:59:59')))
GROUP BY DATE(c.StartingDate)
HAVING Count > 1
但是如何包含在 StartingDate 之前开始并在 StartingDate 结束的约会?
例如
- StartingDate = 2012-11-14 17:00:00,EndingDate = 2012-11-15 08:00:00
- StartingDate = 2012-11-15 09:00:00,EndingDate = 2012-11-15 10:00:00
- StartingDate = 2012-11-15 11:00:00,EndingDate = 2012-11-15 12:00:00
我的报表返回 11 月 15 日的计数为 2。但这是错误的,因为第一次约会不见了。如何包括这些约会?我缺少什么,UNION SELECT、JOIN、子选择?
可能的解决方案?
SELECT
c1.GUID, COUNT('APPOINTMENTS') + COUNT(DISTINCT c2.ANYFIELD) AS Count,
DATE(c1.StartingDate) AS Datum,
COUNT(DISTINCT c2.ANYFIELD)
FROM
t_calendar c1
LEFT JOIN
t_calendar c2
ON
c2.ResourceGUID = c1.ResourceGUID AND
(DATE(c2.EndingDate) = DATE(c1.StartingDate)) AND
(DATE(c2.StartingDate) < DATE(c1.StartingDate))
WHERE
((DATE(c1.StartingDate) <= DATE('2012-11-01 00:00:00')) AND (DATE(c1.EndingDate) >= DATE('2012-11-30 23:59:59'))) OR
((DATE(c1.StartingDate) >= DATE('2012-11-01 00:00:00')) AND (DATE(c1.EndingDate) <= DATE('2012-11-30 23:59:59')))
GROUP BY
c1.ResourceGUID,
DATE(c1.StartingDate)
【问题讨论】:
-
您的可能的解决方案应该怎么做?看来您使事情变得过于复杂并加入了我们甚至不知道的数据...您是否尝试过使用数字表的最终解决方案,它更简单并准确返回您需要的内容?
-
您的
join搜索条件似乎没有意义,除非您的约会的开始日期之后 结束日期...如果您这样做,编写查询会更容易它逐步进行,因此您添加的每个更改都足够简单,易于处理和理解。 或者你真的没有明确自己想要完成什么。点击我的SQLFiddle,你会看到正确且执行良好的正确结果。
标签: mysql select count group-by