2012-03-19 13 views
1

時間報告、時給:PHP/MySQLの:私は次の表は、(簡略化)している

hours    hour_rates 
- user_id   - user_id 
- date    - date 
- hours    - hourly_rate 

時間テーブルの例は:

1 - 2012-03-19 - 8 

つまり、2012においてID = 1を持つユーザ-03-19は合計8時間働いた。

人のための時給は時間的に変化することができます

ので、私は2番目のテーブルを持っている:

hour_ratesテーブル例

だから、ID = 1のユーザのために、我々はの時給を設定します2011年12月1日に20ドル。 2011-12-20に彼の時間単価を25ドルに変更しました。

私が欲しいのは、特定の期間(例えば、2012-01-01 - > 2012-02-01)に特定のユーザー(ex。id = 1)の支払い額を計算することです。

私はこれを単にmysql側で計算できますか? そうでない場合は、効果的なやり方は?

+1

なぜあなたはmysql側でそれをやりたいのですか?mysqlクエリで結果を使用する必要がない場合は、コード内で計算を行う必要があります。そうでない場合はストアドプロシージャ/ファンクションを使用する – scibuff

+1

これを少し違った方法で実行することをお勧めします。エントリを作成するときに 'hours'テーブルで使用される時間別レートのIDを追加します。 – BenOfTheNorth

+0

@BenGriffithsこれは良い選択肢です。 –

答えて

1

次の2つの日付を持つべきです。

select sum(h.hours * hr.hourly_rate) as pay 
    from hours h, hour_rates hr 
    where h.user_id = :user_id --here you will set the user id parameter 
    and h.user_id = hr.user_id and (h.date BETWEEN hr.start_date AND hr.end_date 
    and h.date between STR_TO_DATE('01,1,2012','%d,%m,%Y') and STR_TO_DATE('01,1,2011','%d,%m,%Y') 
+0

男の子、それは私の感覚ではあまりにも複雑すぎる方法です。ちょうど1つのテーブルを使用し、各エントリにuser_id、日付、働いた時間、hourly_rateを入れます。同じ日付のエントリが多いだけです... – Chris

+0

これはあなたが行う必要がある計算のためのより簡単なソリューションです。しかし、他の種類のクエリの場合、ソリューションは、例えば、設計が貧弱になる可能性があります。 1時間当たりの従業員報酬の履歴を表示したい画像。たとえば、2011年1月1日から2011年6月1日まで50ドル/時間から2011年6月2日60ドル/時間など...新しいテーブルでこの計算は簡単ではありません。しかし、それはあなたがしなければならない計算の種類に依存します! –

+0

いいえ、ab_dev86、あなたは間違っている申し訳ありません、それはまったく逆さまです!私のテーブルデザインはそれを非常に簡単に、実際に作るでしょう。あなたは働いている各日の正確なhourly_rateと時間数を使って、全体の作業履歴を持っています。さらに、パフォーマンスに関しては、はるかに速く、複雑ではありません。 – Chris

1

これは単純にmysql側で計算できますか? START_DATEと、これは時間あたりのx $を支払ってきたemplyerをEND_DATEするSTART_DATEから意味END_DATE:

はい、これはhour_ratesテーブルでSQL

select sum(outer_h.hours * 
    (select inner_hr.hourly_rate 
    from hour_rates inner_hr 
    where inner_hr.user_id = outer_h.user_id 
    and inner_hr.date >= outer_h.date 
    order by inner_hr.date asc 
    limit 1) 
) as pay 
    from hours outer_h 
    where outer_h.user_id = :user_id --here you will set the user id parameter 
    and outer_h.date between STR_TO_DATE('01,1,2012','%d,%m,%Y') and STR_TO_DATE('01,1,2011','%d,%m,%Y') 
+0

非常にきれいなクエリのように見えます。私がsospicius abuotの唯一のポイントは、この結合条件を使用し、h.date = hr.dateですが、hr.dateというのは、この日付から今の雇用者はこれが現在時間当たりの価格であるということです。 hr.date = 2012-01-01 2012-01-02の日に雇用するために支払う金額を計算するが、条件が失敗し、クエリによって結果が返されないと仮定する。私はそれがわからない、クエリはテストされるべきです... –

+0

うーん...あなたは絶対に正しいです、私は十分に慎重ではなかった、ちょうど質問を通して見て、簡単な答えを書きました。私はこれを解決させてください。 – bpgergo

1

EDIT::だから、申し訳ありませんが、あなたはそのための2つのテーブルを何が必要なのですか

次に、このように変更されbpgergoによって提案された同じクエリを使用できますか?彼らは毎日が独自のhourly_rateを持つことができるならば、あなただけのようにそれを格納する必要があり、全く同じである:例えばuser_idは、日付、時間、hourly_rate

時間1 | 2012-03-19 | 8 |あなたは

SELECT user_id, date, hours, hourly_rate FROM hours WHERE (user_id=$var_of_user_id AND date ...) 

を使用して、例えば、各行の時間* hourly_rateを乗算し、$和に追加25

while {... 

$sum=$sum+($row['hours']*$row['hourly_rate']); 

} 

hourly_rateは何を依存するのでしょうか?おそらく、あなたはhour_ratesテーブルにフィールドの日付を入れたくないでしょう。

各ジョブでhourly_rateが異なる場合は、user_id、start_date、end_date(またはhours hours)とhourly_rateの各テーブルを1つだけ使用したいとします。

hourly_rateはuser_idだけに依存している場合は、次の2つのテーブルが欲しい:

時間:user_idは、START_DATE、END_DATE(または時間働いていた)

hourly_rate:user_idは、hourly_rateを

user_idのテーブルを結合します。すでにテーブルユーザーがいる場合は、2番目のケースでhourly_rateも保存できます。

そして、単に時間を掛けるためにPHPを使用するにはuser_idの...など

+0

人の時間単価は、同じタスク、同じプロジェクトに対して時間的に変化します。 –

+0

@Tamas Pap:hourly_rateはまだ修正されていますが、50USDで1時間働いた後は変更できないことを意味します.2週間後、あなたは先週あなたが行ったことで30USDしか得られません。 – Chris

+0

@Tamas Pap:私の更新を見てください... – Chris

1

は、このクエリは動作するはず時給で働いていた:

SELECT SUM(h.hours*COALESCE(hr.hourly_rate,0)) AS salary 
FROM hours h 
LEFT JOIN hour_rates hr 
ON h.user_id = hr.user_id 
AND hr.date = (SELECT MAX(hd.date) FROM hour_rates hd 
       WHERE hd.user_id = h.user_id AND hd.date <= h.date) 
WHERE h.user_id = 1 
AND h.date BETWEEN '2012-01-01' AND '2012-04-01' 

合体部分は時給場合にはただそこにありますpayが指定されたユーザと日付に対して定義されていない場合は、0ではなくデフォルトレートを設定できます。また、hour_ratesテーブルのすべてのペア(user_id、date)が一意であることを確認してください。

+0

+1私のためにCOALESCEを紹介します。 –

関連する問題