假设我有一个名为“志愿人员”的mysql表,它显示了已经注册工作的特定时间轮班的人:
Volunteers
==============
**UserId** int
**StartTime** datetime
**EndTime** datetime假设这个表包含以下记录:
(1, '2012-01-01 00:00:00', '2012-01-01 01:00:00')
(2, '2012-01-01 00:00:00', '2012-01-01 00:30:00')
(3, '2012-01-01 00:30:00', '2012-01-01 01:00:00')
(4, '2012-01-01 00:00:00', '2012-01-01 00:15:00')
(5, '2011-12-31 23:00:00', '2012-01-01 02:00:00')
(6, '2012-01-01 00:00:00', '2012-01-01 00:00:30')
(7, '2012-01-01 00:00:00', '2012-01-01 00:40:00')
(8, '2012-01-01 00:20:00', '2012-01-01 01:00:00')我想计数从这个表中的所有记录,在这个表中,用户已在00:00:00到01:00:00注册工作,但也包括在此计数中可以聚合到所需时差的时间间隔。
例如,使用上面的示例,理想的sql查询将返回4。
解释:
用户1已注册完成整个所需的轮班,因此这将使计数增加1。
用户2和3已经注册了工作时隙,这些时隙聚集到了所需的时差,因此这会使计数增加1。
用户4的时间差不能与其他用户的时间差聚合以覆盖所需的时间差,因此这不会增加计数。
用户5涵盖了整个所需的时差,因此这会使计数增加1。
用户6有一个时差,可以与用户8的时差聚合,以覆盖所需的时间偏移,因此这将增加1的计数。
用户7具有可以与用户8的时差聚合以覆盖所需时差的时差,但如果用户8已经与用户6聚合以产生所需的时差,则不应将其包括在计数中。因此,这不会添加到计数中。
因此,计数等于4。
你会怎么做呢?这有可能吗?
发布于 2012-12-09 03:35:04
我认为您的问题不太适合用SQL完全解决。这是我解决它的方法。
选择与您感兴趣的班次重叠的所有志愿者。
然后,在应用程序层(php/.NET/perl/任何其他)中应用此算法:
https://stackoverflow.com/questions/13782711
复制相似问题