【发布时间】:2014-12-17 10:07:04
【问题描述】:
我有两个 MySQL 表,都包含 DATETIME 字段:
- 表
beginnings包含启动某个进程的时间 - 表
events包含由该进程引起某些事件的时间
开始是在晚上;事件发生在第二天早上。请注意,每个开始之后都会有数量不断变化的多个事件!
这里有两个示例表:
CREATE TABLE IF NOT EXISTS `beginnings` (
`bid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`begin` datetime NOT NULL,
PRIMARY KEY (`bid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
INSERT INTO `beginnings` (`bid`, `begin`) VALUES
(1, '2014-09-24 22:44:00'),
(2, '2014-09-25 21:32:00'),
(3, '2014-09-28 22:01:00');
CREATE TABLE IF NOT EXISTS `events` (
`eid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`event` datetime NOT NULL,
PRIMARY KEY (`eid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
INSERT INTO `events` (`eid`, `event`) VALUES
(1, '2014-09-25 02:07:00'),
(2, '2014-09-25 04:06:00'),
(3, '2014-09-25 05:50:00'),
(4, '2014-09-26 02:07:00'),
(5, '2014-09-26 04:15:00'),
(7, '2014-09-29 01:08:00'),
(8, '2014-09-29 04:21:00'),
(6, '2014-09-29 05:02:00'),
(9, '2014-09-29 05:25:00');
我想计算每个事件和各自开始之间的时间差(以分钟为单位)。
目前我正在从数据库中提取数据,将日期时间条目转换为时间戳,并计算 PHP 中的差异。这是一个简化的示例代码,其中包含数字,便于阅读:
$events = range(1, 50);
$beginnings = array(7, 11, 19, 27, 29, 36, 40, 43);
$events = array_merge(array_diff($events, $beginnings));
$differences = array();
for($i = 0; $i < count($beginnings); $i++) {
foreach($events as $event) {
if($event > $beginnings[$i] && $event < $beginnings[$i + 1]) {
$differences[] = $event - $beginnings[$i];
}
}
}
我的问题:
是否可以在查询时在 MySQL 中计算出这些差异?
示例:
你是一家汽车厂的老板。每天晚上,在你睡觉之前,你告诉夜班的团队每人制造一辆汽车,并记录他们何时完成。当你早上回来时,你想计算不同团队建造各自的汽车花了多长时间。您会看到一个团队在两个小时内完成了他们的汽车,而另一个团队需要五个小时来完成他们的汽车。你很好奇,所以你会记下一年的时间,然后做一些统计。
【问题讨论】:
-
events表与beginnings表有什么关系? -
@AbhikChakraborty 我不确定我是否理解您的问题。每个事件(清晨的某个时间)都从一个开始(前一个晚上的某个时间)开始。每个开始都可能引发多个事件,因此多个事件共享一个开始。希望这是有道理的。
-
为什么开始是一个单独的表?当然,“开始”只是一系列事件中的第一个事件?
-
@Strawberry 是的,开始和事件都可以列在同一个表中,并有一列标识哪些日期时间是哪些。如果这样的数据库设计有助于实现我的目标,请说明如何实现。