1

私はデータベースからこのデータを持っています。

+----+------------+----------+
| 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 の期間は、日付 id - id #1#1と等しくなければなりません#2
  • id の期間は、日付 id - id #2#2と等しくなければなりません#3

同じ場合はid追加されます。

申し訳ありませんが、これは私の頭の中にあるだけで、PHP ではまだ非常に新しいため、開始方法がわかりません。どんな助けでも大歓迎です。ありがとう

日付順に編集しました。1 番目のレコードの期間または合計時間 = 2 番目のレコード - 1 番目のレコード

4

1 に答える 1

0

私があなたを正しく理解していれば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 />';
  }

これらの表は逆順になっていることに注意してください。

于 2013-03-01T08:50:02.440 に答える