Microsoft Access 掲示板

深夜給の計算について

8 コメント
views
4 フォロー

22:00以降の勤務の場合、時給の1.25倍を支払います。

深夜勤務時間分: DateDiff("n","22:00",[退勤])

分からないのは、24:00を超えたが場合ですが、Switch関数とかで場合分けすると思います。


深夜勤務時間分: Switch([退勤]<=#0:00:00#,DateDiff("n","22:00",[退勤]))

この時点で、深夜勤務時間分が空白になりすが、[退勤]<=#0:00:00#がおかしいのでしょうか?

回答いただけると幸いです

シン
作成: 2024/05/27 (月) 12:32:37
通報 ...
1

[退勤]<=#0:00:00# になることはないはずですからそうなりますね。(0以下の時刻をどのように入力するのか?)

退勤管理では、[出勤]、[退勤]フィールドに日付成分も含める方法と、時刻成分のみににする方法があります。

おそらく時刻成分のみの方法を採用しているということだと思いますが、その場合、#0:00:00#を超えて勤務した場合の対策に工夫が必要です。

24時間以上連続で勤務することはないはずですから、[出勤] > [退勤] なら#0:00:00#を超えて勤務していると判断できます。その場合は、[退勤]に24時間(1440分)を加算すればいいでしょう。

深夜勤務時間分: DateDiff("n",#22:00#,[退勤])+IIf([出勤]>[退勤],1440,0)
2
hiroton 2024/05/27 (月) 13:40:00 12727@f966d

#0:00:00#はデータ的には数値の「0」です。[退勤]<=#0:00:00#は基本的にFalseになるでしょう

Switch 関数

質問の式では、Switch関数はNullを返しているので空白になっているのでしょう


【Excel VBA】24時間以上の合計を求める方法(後編)(prtn-blogさん)

タイトルはExcelですが、VBA部分がACCESSに相当します。要約すると、24以上の時間表示はそのままでは使えません(「以上」です。24:00もNGです)

24時以降の場合、「[退勤]」をどのように記録してるのでしょうか?
最終的にはTimeSerial関数を経由して時間計算させるのがいいんじゃないでしょうか?

?DateDiff("n","22:00",TimeSerial(25, 30, 0))
 210 
3
シン 2024/05/27 (月) 13:49:29 484b4@d339c

hatena様、hiroton様 回答ありがとうございました。
感謝します。

4
hiroton 2024/05/27 (月) 13:58:45 修正 12727@f966d

データ型を日付/時刻型にしてあり、時刻のみ保存しているならば、

TimeValue(1-#22:00#+[退勤])

なんて方法でもいいかもしれません

5
シン 2024/05/27 (月) 15:42:58 484b4@d339c

hiroton様
ありがとうございます。

6

通常気勤務時間分と深夜勤務時間分に分けて表示したいのだと思います。

下記の3パターンが考えられます。
通常勤務時間のみ
 例 15:00 ~ 22:00

通常勤務時間から深夜勤務時間まで
 例 16:00 ~ 23:00 
    18:00 ~ 01:00 

深夜勤務時間のみ
 例 22:00 ~ 03:00

最後のパターンはない、考慮しないということなら、下記のような式を作成すればいいでしょう。

退勤1: [退勤]+IIf([出勤]>[退勤],1,0)

通常勤務時間分: DateDiff("n",[出勤],IIf([退勤1]>#22:00:00#,#22:00:00#,[退勤]))

深夜勤務時間分: IIf([退勤1]<=#22:00:00#,0,DateDiff("n",#22:00:00#,[退勤1]))

退勤1 は後の式で参照するための式です。

もし、深夜勤務時間のみ、あるいは 03:00 ~ 10:00 というような勤務がありえる、となるともっと複雑な式になります。

7
シン 2024/05/27 (月) 15:54:18 484b4@d339c

hatena様
ありがとうございました。

8
タークン 2024/05/30 (木) 17:43:15 7a0a1@2705a

これ、残業加算される場合や、24時間以上、休憩時間がからむので、かなりやっかいなのです。
特に厄介なのは、休憩時間の処理でした。
どこで休憩したかによって、単価が違ってくるからです。
逆に、休憩時間を無視していいなら、なんの工夫も必要ないです。

私の場合は、勤務開始から終了まで追っていく過程で、集計中の時間が通常時間帯と、深夜時間帯のどちらのブロックに属しているかを判定することで、正しく計算できるようになりました。
4打刻制から、6打刻制に対応させることも可能です。

端的に、説明する事が出来なくてすみません。
これは、プログラムの技術的な問題というより、処理する方法の問題だと思います。
正解も、たくさんあるはずです。