我从数据库中获得了这些数据。
+----+------------+----------+
| id | date time | duration |
+----+------------+----------+-----------
| 3 | 2012-12-20 09:28:53 | ? |
| 1 | 2012-12-20 19:44:10 | ? |
| 2 | 2012-12-23 16:25:15 | |
| 4 | 2012-12-23 18:26:16 | |
| 4 | 2012-12-24 08:01:27 | |
| 5 | 2012-12-29 20:57:33 | |
| 5 | 2012-12-29 20:57:33 | |
+----+------------+----------+------------
- id
#1
的持续时间应等于日期id#2
- id #1 - id
#2
的持续时间应等于日期id#3
- id #2
如果id
是相同的,它将被添加。
对不起,这只是在我的脑海中,在php中仍然很新,所以我不知道如何开始。任何帮助都是感激的。由于
编辑按日期排序。第一个记录的持续时间或总时间=第二个记录-第一个记录
如果我理解正确的话,有一个叫做id=3
的东西,它从"2012-12-20 09:28:53"开始,然后以"2012-12-20 19:44:10"结束,在同一秒钟,id=3
开始,你想知道一切持续多久?
我会为所有记录做一个循环,但我会从结束(在SQL: ...ORDER BY date_time DESC
)开始,假设最后一个结束(即。id=5
开始于2012-12-29 20:57:33)现在,然后我计算持续时间作为日期(开始和结束)的减法,然后我将事件开始作为前一个的结束,等等。
示例(未测试):
$end=now();
$dbh=new PDO(...); // here you need to connect to your db, see manual
while($record=$dbh->query('SELECT id, datetime FROM table_name ORDER BY datetime DESC')->fetchObject()){
$start=$record->datetime;
echo $duration=$end-$start; // convert $end and $start to timestamps, if necessary
$end=$start; // here I say that next (in sense of loop, in fact it is previous) record will end at the moment where this record started
}
这不是总和,因为我不知道你将如何存储你的数据,但我认为你可以用它来管理。
编辑开头我定义了一个数组:
$durations=array(); // this will hold durations
$ids=array(); // this will hold `id`-s
$last_id=-1; // the value that is not existent
然后代码跟随,而不是echo
,我把这个:
$duration=$end-$start;
if($last->id==$record->id){ // is this the same record as before?
$durations[count($durations)-1]->duration+=$duration; // if yes, add to previous value
}
else { // a new id
$durations[]=$duration; // add new duration to array of durations
$ids[]=$record->id; // add new id to array of ids
$last_id=$record->id; // update $last_id
}
,然后是$end=$start
。
查看所有持续时间和id,只需
for($i=0;$i<count($durations);$i++){
echo 'id='.$ids[$i].', duration='.$durations[$i].'<br />';
}