「ブロック機能」のリニューアルについて

時給毎の勤務時間を求めるSQLを書こうとしているのですが、わけがわからなくなりました。


9:00~15:00 時給1,000円
15:00~21:00 時給1,100円
21:00~24:00 時給1,200円

シフトが3パターンあるわけではなく、時間帯で時給が変わるだけです。
9:00~18:00まで勤務する人がいる場合、
12:00~13:00の休憩時間を除いて、
1,000円→5時間
1,100円→3時間
というのをSQLで求めたいのです。

遅刻した場合は出勤時刻から計算し、休憩時間中も働いた場合は加算します。
ですので、休憩に入るときはタイムカードを打刻します。

9:30~18:30まで勤務した場合、9:00~18:00と同じ計算結果になります。

遅刻したときや休憩時間に突入したときなど、CASE文で入れ子だらけになって混乱してきました;

良いSQLがあれば教えてください。

質問者からの補足コメント

  • 計算はMS SQL Server のテーブル値関数で構築しています。

    例えのお話ですが、1分丸めですので、
    1,000円×0.5時間=500円
    1,100円×0.5時間=550円
    で、14:30~15:30勤務ですと、1,050円になります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/02/26 17:19
教えて!goo グレード

A 回答 (2件)

分単位の丸めとかとりあえずおいておきましょう


create table shift(id int,hour int,wage int);
insert into shift values
(1,9,1000),
(2,10,1000),
(3,11,1000),
(4,13,1000),
(5,14,1000),
(6,15,1100),
(7,16,1100),
(8,17,1100),
(9,18,1100),
(10,19,1100),
(11,20,1100),
(12,21,1200),
(13,22,1200),
(14,23,1200),
(15,24,1200);

//9:00~18:00

select sum(wage) from
(select 9 as start,17 end) work
left join shift
on hour between start and end
    • good
    • 0

SQLはMSのSQL Serverですか?


プロシージャとか使わないときびしいかも

かりに14:30-15:30はたらくと14:00勤務と同様で1000円しかもらえないんですね?そうなると人がいなくて「30分だけ早く入ってくれない?」
とか絶対たのめないですね
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング