みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
win10
fm15 ad
現在深夜勤務時間の計算方法を考えているのですがいまいちピンときません。
22時から5時までの勤務時間が深夜勤務として、21時から6時まで働いた場合勤務時間が9時間でわかるところですが深夜勤務時間が7時間というような計算方法を聞きたいところです。私がいろいろ調べて書いてみたのが
出勤時刻(タイムスタンプ)、退社時刻(タイムスタンプ)、深夜時間(時刻)という感じでフィールドがあります。深夜時間は入力値の自動化の計算のところで
Min ( 退社時刻;Time ( 5 ; 0 ; 0 ) )-Min ( 出勤時刻;Time ( 5 ; 0 ; 0 ) ) +
Min ( Max ( 退社時刻;Time ( 22 ; 0 ; 0 ));Time ( 29 ; 0 ; 0 ) )-Max ( 出勤時刻;Time ( 22 ; 0 ; 0 ) )
というやり方でやってみましたがうまく動きません。ご伝授いただけませんでしょうか?
Offline
勤務時間が24時間を超えることが有りますか?
出勤時刻が5時以前が有りますか?
Offline
愚直にやるしかないんじゃないかな。
Let ( [
$on = Date ( Month(出社) ; Day(出社) ; Year ( 出社 ) );
$off = Date ( Month(退社) ; Day(退社) ; Year ( 退社 ) );
$pm10 = Timestamp ( $on ; Time ( 22; 0 ; 0 ) );
$am5 = Timestamp ( $off ; Time ( 5; 0 ; 0 ) )
];
If ( $off > $on ;
Case (
退社 > $am5 and 出社 ≥ $pm10 ; $am5 - 出社 ;
退社 > $am5 and 出社 < $pm10 ; $am5 - $pm10 ;
退社 > $pm10 ; 退社 - $pm10 ;
出社 > $pm10 ; 退社 - 出社 ;
0
) ;
Case (
退社 > $pm10 ; 退社 - $pm10 ;
出社 > $pm10 ; 退社 - 出社 ;
0
)
)
)
漏れがあるかもしれません(^_^;)
Offline
チポ様
さっそくご連絡いただきありがとうございます。説明不足で申し訳ございませんでした。勤務時間が24時間を超えることがあり、また出勤時刻が午前5時以前があります。
Offline
やっぱり漏れてた。
深夜0時過ぎに出社しても深夜勤務が0になってしまいます。
二つ目のCaseに
出社 < $am5 ; $am5 - 出社
を追加して下さい。
まだありそうだな(^_^;)
Offline
24時間超えもあるとは。
24時間を超える場合、24時間ごとに7時間足せばいいかな。
かなりブラック。
Offline
yaya様
ご回答ありがとうございます。愚直にやるしかないところでも細かく回答していただきありがとうございます。これから試してみたいと思います。
Offline
yaya様
先日はご回答ありがとうございました。試してみましたが日をまたぐとうまく動いてくれませんでした。考え方に何かヒントがあるとよいのですが、そこにたどり着くのも難しいところです。
Offline
どのようにうまく行きませんか?
値が出てこないとか、?で表示されるとか、トンでもない値になるとか。
あと、全部駄目なのか、特定の出社・退社のとき駄目なのか。
Offline
yaya様
連絡ありがとうございます。現状以下のような結果となります。
21:00~0:00ですと深夜時間が08:00となり不正解です。
21:00~23:00ですと深夜時間が01:00で正解です。
23:00~05:00ですと深夜時間が06:00で正解です。
0:00~05:00ですと深夜時間が0:00で不正解です。
03:00~05:00ですと深夜時間0:00となり不正解です。
いろいろ考えてもいるのですが、頭がこんがらがっている状況です。ご伝授いただければ幸いです。
Offline
愚直方のいい所は間違った所を見つけやすいことです。
下の2つは#5に該当しますので書いてあるとおり、#3の下のCaseを
Case (
退社 > $pm10 ; 退社 - $pm10 ;
出社 > $pm10 ; 退社 - 出社 ;
出社 < $am5 ; $am5 - 出社 ;
0
とすれば直ります。
1番目は謎ですね。手元で試す限りでは 2:00 になってます。
Offline
yaya様3
ご連絡ありがとうございます。現在も葛藤しているところですが、
#10の
03:00~05:00ですと深夜時間02:00となり正解になりました。
0:00~05:00ですと深夜時間が05:00で正解になりました。しかし指摘されたように
21:00~0:00ですと深夜時間が08:00となり不正解のままですが、どこか注意する箇所とかありますでしょうか?ちなみに退社・出社の部分はタイムスタンプなのですがそのままでいいのでしょうか?
Offline
考え方を簡単にするために全ての時刻を2時間進めて、深夜勤務の始まりを
00:00:00
からにします。
各時刻だけを取り出して、
出勤時刻と退勤時刻の大小に分けて、
その間に含まれる深夜勤務時間を求めます。
勤務時間中に24時間が含まれる回数を求めて、その回数分7時間を加えます。
以上の考えで下記式を作りました。
テストしてつもりですが、抜けが有るかもしれません。
検証してみてください。
Let ( [
$on = GetAsTime ( 出勤時刻 ) + Time ( 2 ; 0 ; 0 ) ;
$off = GetAsTime ( 退勤時刻 ) + Time ( 2 ; 0 ; 0 ) ;
//時刻を2時間進める
$on = $on - ( $on ≥ Time ( 24 ; 0 ; 0 ) ) * Time ( 24 ; 0 ; 0 ) ;
$off = $off - ( $off ≥ Time ( 24 ; 0 ; 0 ) ) * Time ( 24 ; 0 ; 0 ) ;
//24時以上の時刻の補正
$mf = Time ( 7 ; 0 ; 0 ) ;
//深夜の終了時刻
$dt = 退勤時刻 - 出勤時刻 ;
$dt = Int ( $dt / Time ( 24 ; 0 ; 0 ) ) ;
//24時間の回数
$mt1 = $mf * $dt ;
$mt2 = Case ( $on < $off ; Case ( $on < $mf ; Min ( $mf ; $off ) - $on ;
$off < $mf ; $off - Max ( $mf ; $on ) )
//出勤時刻 < 退勤時刻の計算
; $on > $off ; Case ( $on < $mf ; $mf - $on +$off ;
$off < $mf ; $off ; $mf ) )
//出勤時刻 > 退勤時刻の計算
];
$mt1 + $mt2
)
Offline
ちゃぶ台返しで申し訳ない。
am5前に出社して、pm10時過ぎに退社するのが抜けていたのを入れるために整理し直しました。
24時間以上については考慮してありませんので、以下がOKなら追加してください。
Let ([
$onTime = GetAsTime ( 出社 );
$offTime = GetAsTime ( 退社 );
$pm10 = Time ( 22 ; 0 ; 0 );
$am5 = Time ( 5 ; 0 ; 0 );
$pm10ts = Timestamp ( GetAsDate ( 出社 ) ; $pm10 );
],
If ( $offTime >= $pm10 or $offTime < $am5 ;
// 退社が深夜帯
Case (
$onTime >= $pm10 ; 退社 - 出社;
$onTime >= $am5 ; 退社 - $pm10ts ;
// 早朝出勤後、深夜帯まで
退社 - 出社 - Time ( 17 ; 0 ; 0 )
);
// 退社が通常ならam5前出社が深夜勤務
If ( $onTime < $am5 ; $am5 - $onTime ; 0 )
)
)
GetAsTime()、GetAsDate()が引数にTimestampを取れるとは知りませんでした。
Offline
チポ様
圧巻な計算ありがとうございます。複雑な式ですが大変勉強になります。頂いた回答の中での”勤務時間中に24時間が含まれる回数を求めて、その回数分7時間を加えます。”というのはどのような考えのもとでそうなるのでしょうか?また式の中の24時間の回数というのはどういうことなのでしょうか?勉強不足で理解が難しく恐縮です。
Offline
yaya様22
式を改めて改良していただきありがとうございます。頂いた式を当てはめてみたのですが、式を入力してOKボタンを押すと”この計算式は一覧を表示できません”と出てきます。;などを見直しても大丈夫そうなのですが何か違うのでしょうか?
Offline
ごめんなさい、修正前のを上げてしまいました。
6行目の末尾のセミコロンが余分です。
Offline
1時間毎に分離して評価しながら計算するサンプル
https://www.dropbox.com/s/pbzbieq3okwvv … 7.zip?dl=0
1時間毎に深夜を設定するフラグフィールド(繰り返しグローバル)、
1時間毎に労働時間を計算する繰り返し計算フィールド
Let (
[
t0 = 出勤時刻[1] - GetAsTimestamp ( GetAsDate ( 出勤時刻[1] ) & " 0:0:0" ) ;
t1 = 退社時刻[1] - GetAsTimestamp ( GetAsDate ( 出勤時刻[1] ) & " 0:0:0" ) ;
b1 = Get ( 計算式繰り返し位置番号 ) * 3600 ;
b0 = b1 - 3600
] ;
Case (
t1 < b0 ; 0 ;
t0 > b1 ; 0 ;
Min ( t1 ; b1 ) - Max ( t0 ; b0 )
) * g_深夜設定
)
を作り,それを Sum() すれば良いです。
深夜設定を時給(秒給)に変えけば,時刻毎に変わる時給でも、日給計算が簡単です。
Last edited by Shin (2017-04-28 08:54:52)
Offline
勤務時間が24時間を過ぎると必ず深夜勤務時間帯の7時間を経過しますよね、
ですから、勤務時間から24時間を引けるだけ引いて、
その回数分、深夜勤務時間の7時間を加えればいいわけです。
後は残りの時間帯に含まれる深夜時間帯をそれに加えます。
Offline
shin様
いつもいつも回答いただきありがとうございます。サンプルまでいただいてありがたいです。すぐにでも検証をしたいところですが、只今私の仕事で取組み中であり取り急ぎお礼まで。ありがとうございます。
Offline
チポ様
私の経験不足の中細かく解説していただきありがとうございます。いただいた式も大変難しいと私は感じているのですが、しっかりと検証をし理解をしていきたいと思っております。只今私の仕事で取組み中で取り急ぎお礼まで。ありがとうございます。
Offline
shin様
いつもお世話になります。ゴールデンウィークも落ち着きようやくファイルを開いて確認することができました。大変遅くなり申し訳ございません。確認させていただいたところ”時刻毎に変わる時給でも、日給計算が簡単”というところもこの先に起こりえることも考慮していただいてありがとうございます。繰り返しフィールドが72回分(3日分?)あるのはどういうことから考えられることなのでしょうか?
Offline
yaya様
6行目のセミコロンの件ありがとうございます。yaya様から頂いた内容おかげさまで動くようになりました。
Offline
繰り返し72は、最大の勤務時間が24時間を超える可能性がある(48時間を超える事は無いと思いますので)、という事ですので、23時頃よりの勤務で26時間勤務になると3日分の計算が必要になる事を考えた物です。そのような極端な事が無ければ48にしておかれていいと思います。その方が計算も速くなります。
時刻によって時給が変わる事はよくある事で、深夜特別手当も時給の変更扱いで一気に計算できますので、かなり有利かと思います。
Offline
shin様
ご回答ありがとうございました。仰る通り時給が変わることはよくあることで、考慮していただいてありがとうございました。
Offline
[ Generated in 0.007 seconds, 7 queries executed - Memory usage: 574.45 KiB (Peak: 611.36 KiB) ]