2010-12-07 8 views
2

/アウトデータ項目内のすべての従業員は、この形式でフェッチされます。計算 - PHP/MySQLは

logtype       time  Date 
------------------------------------------------------ 
start_time [come office]   10:30 11-11-2010 
end_time [go to lunch]    14:00 11-11-2010 
start_time [come back from lunch] 15:00 11-11-2010 
end_time [out from office]   20:00 11-11-2010 

質問:

どのように私ができます

  • 'start time''end time''total time including lunch time''total time excluding lunch time'

    1. 開始時間を計算し、エンドティムランチタイム
    2. 合計時間ランチタイム
  • +0

    データ型を含む明示的なスキーマを指定できますか? – Riedsio

    +0

    'start_time'と 'end_time'のデータ型は 'TIME'です。もっと質問できます。 – shaji

    答えて

    1

    を除く含む電子

  • 合計時間、私はそれについて考えてきた、と私は、各項目を反復して計算を自分で作ることなくこれを行う方法が表示されません。 「日」列を追加することができます(例:DAYOFMONTHDAYOFWEEK、またはDAYOFYEAR)。その後、ログイン/ログアウト時間を「時間」の昇順で開始します。唯一の問題は「オープンエンド」の時間(ユーザーがパンチ・イン/アウトしていないシナリオ)です。

    私が見てきたほとんどのタイムテーブルは、(通常は)4つの列を使用してこれを排除しています。

    • Work_Day
    • Login_Time
    • Logout_Time
    • は、その後、あなたが不足している値があった場合、結論付けることができ(時間フィールドの一つがNULLだろう)と行うことができます

    をHours_Worked作業時間数(またはWork_Dayを計算のルートとして使用して簡単に列を追加した週単位)のテーブルに対するクイッククエリ。擬似コードは行くだろう、しかし、元の質問に答えるために

    このような何か:

    // $query = mysql_query(....) // <-- populate this 
    $times = Array('start'=>null,'end'=>null); 
    $result = Array('start_time'=>null,'end_time'=>null,'total_wo_lunch'=>0,'total_w_lunch'=>0); 
    while ($log = mysql_fetch_array($query)){ 
    {  
        $_ = $log['date'].' '.$log['time'].':00'; 
        $_datetime = strtotime($_); 
    
        if (is_null($result['start_time'])) $result['start_time'] = $_datetime; 
        else $result['end_time'] = $_datetime; 
    
        if (is_null($times['start'])) $times['start'] = $_datetime; 
        else if (is_null($times['end'])) { 
        $times['end'] = $_datetime; 
    
        $diff = ($times['end']-$times['start'])/3600; // convert to hours 
    
        $result['total_wo_lunch'] += $diff; 
    
        $times['start'] = null; 
        $times['end'] = null; 
        } 
    } 
    $result['total_w_lunch'] = ($result['end_time']-$result['start_time'])/3600; // convert to hours 
    
    print_r($result); 
    

    EDITv2

    これは動作するコードとアップデートです。私の唯一の問題は、タイムカードで少し丸めたことです(8.5時間の作業日は8.53になりますが、理由はわかりませんが、9.5時間と同じです)。それ以外はうまくいくようです。他の変更を見たい場合は教えてください。私は概念的には多かれ少なかれ進んでいました。

  • +0

    ありがとうBRAD – shaji

    +0

    よろしくお願いします。そして、私はテストするためにそれを実行しませんでしたが、それはうまくいくはずです(私はバグがあるコードを書いています:笑)。しかし、あなたがそれを変更しなければならないかどうか教えてください。また、これがあなたが探していた答えだった場合は、必ずそれを受け入れてください。 ;-) –

    +0

    こんにちはブラッド...私はあなたのコードから100%の出力を得ていないが、私は私の要件を達成するためのロジックを得た – shaji