2016-07-15 7 views
1

私はこの問題を解決しようとしています。重複しない分/分

私はスタッフの一人で働いている時間数を知る必要があります店内にはだけです。ここで

がdaynumber = 0(月曜日)のためのデータである。この日のために

table data - example

、staffidとスタッフは= 32店で11時から11時05分に一人です。

これまでのところ、すべての開始時間を追加するだけですが、基本的に私が考えているのは、スタッフが一人であることを知る方法があれば、インデックスと次の時間の間の時間を計算できます。

for($i=0; $i<count($results); $i++){ 
    if(isset($results[$i+1])){ 
     if($results[$i]->starttime < $results[$i+1]->starttime) 
      $start = strtotime($results[$i]->starttime); 
      $end = strtotime($results[$i+1]->endtime); 
      $minutes += idate('i', $end - $start); 
     } 
    } 
} 

更新1: 私はこれにもかかわらず運がない。

for($i=0; $i<count($results); $i++){ 
     if(isset($results[$i+1])){ 
      $StartDate1 = strtotime($results[$i]->starttime); 
      $EndDate1 = strtotime($results[$i]->endtime); 
      $StartDate2 = strtotime($results[$i+1]->starttime); 
      $EndDate2 = strtotime($results[$i+1]->endtime); 

      if(($StartDate1 <= $EndDate2) && ($EndDate1 >= $StartDate2)){ 
       $StartDate1 = idate('i', $StartDate1); 
       $EndDate1 = idate('i', $EndDate1); 
       $StartDate2 = idate('i', $StartDate2); 
       $EndDate2 = idate('i', $EndDate2); 

       $a = abs($EndDate1 - $StartDate1); 
       $b= abs($EndDate1 - $StartDate2); 
       $c = abs($EndDate2 - $StartDate2); 
       $d = abs($EndDate2 - $StartDate1); 

       $minutes += min([$a,$b,$c,$d]); 
      } 
     } 
    } 

私は間違っていますか?

+2

あなたが書いたコードを修正しようとします。私たちはあなたのためにコードを書いたり、システムを設計するためのものではありません。それがあなたの仕事です。 –

+0

24時間モードでのクロック? PHP? – Mickey

+0

ここに何か助けになるかもしれません:[Mysql - >日時の関数](https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html) – FirstOne

答えて

0

ここでは、ユーティリティテーブル(この場合は0〜9の整数のテーブル)を使用して1つのアイデアを示します。 ユーティリティテーブルはいくつかの面倒を見せていますが、タイピングが少なくて済むので好きです。 テーブルを常にUNIONの文字列で置き換えることができます。

これは、すべての日間です。特定の日にフィルタをかける方法を示すために後で変更することがあります。

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT SEC_TO_TIME((i4.i*1000+i3.i*100+i2.i*10+i1.i)*60) n 
    FROM ints i1 
    JOIN ints i2 
    JOIN ints i3 
    JOIN ints i4 
    JOIN 
    (SELECT daynumber 
      , MIN(starttime) starttime 
      , MAX(CASE WHEN endtime < starttime THEN SEC_TO_TIME(TIME_TO_SEC('24:00:00')+TIME_TO_SEC(endtime)) ELSE endtime END) endtime 
     FROM my_table 
     GROUP 
      BY daynumber 
    ) x 
    ON SEC_TO_TIME((i4.i*1000+i3.i*100+i2.i*10+i1.i)*60) BETWEEN x.starttime AND x.endtime 
    JOIN my_table y 
    ON SEC_TO_TIME((i4.i*1000+i3.i*100+i2.i*10+i1.i)*60) BETWEEN y.starttime AND CASE WHEN y.endtime < y.starttime THEN SEC_TO_TIME(TIME_TO_SEC('24:00:00')+TIME_TO_SEC(y.endtime)) ELSE y.endtime END 
GROUP 
    BY n HAVING COUNT(*) = 1; 

The number of lone minutes is equal to the number of rows in this result. 
+0

レスポンスありがとう@Strawberry、しかし私はPHPソリューションを探しています。私はまだこれに気づいていますが、これを理解することができれば投稿します。ありがとう! – Limker

関連する問題