日をまたぐ勤務時間の計算。夜勤・深夜帯・25時入力・同じ時刻を、実際のExcelで確かめた式

2026-09-20シフト・勤怠

出勤22:00、退勤7:00、休憩60分。この行の労働時間を =(F8-E8)*24-G8/60 で出すと、マイナス16になる。Excelは時刻を「1日を1とした小数」で持っていて、7:00は0.2917、22:00は0.9167。引くと負になる。夜勤のある職場の勤怠表で、最初に誰もが踏む。

配布している勤怠管理のテンプレートは、この問題を式の中で片付けている。式は2026年9月20日に、配布ファイルをそのままMicrosoft 365のExcel(バージョン16)で開き、8つの場合を入れて計算させた。結果は後半の表にある。

退勤が出勤より小さければ、1日足してから引く

夜勤の式は、退勤が出勤より小さいときだけ退勤に1を足す。1は1日なので、7:00が翌日の7:00(1.2917)になり、22:00を引くと0.375、24を掛けて9時間、休憩の1時間を引いて8時間。

実働:  =IF(OR(A8="",E8="",F8=""),"",ROUND((IF(F8<=E8,F8+1,F8)-E8)*24-N(G8)/60,2))

A列が日付、E列が出勤、F列が退勤、G列が休憩(分)。日付か出勤か退勤が空欄なら空文字を返す。休憩は N(G8) で読んでいて、空欄なら0として扱う。最後にROUNDで小数2桁に丸めているのは、時刻の小数を24倍すると 8.000000000000004 のような端数が出るからだ。丸めないと、合計や「8時間を超えたか」の判定でずれる。

同じことを =MOD(F8-E8,1)*24 と書く方法もある。MODは引き算の結果が負なら1を足して正にするので、IFを書かずに済む。22:00から7:00で9、休憩を引く前の値として同じ結果になる。私がIFで書いているのは、次の節の「同じ時刻」の扱いを自分で決めたかったからだ。

出勤と退勤が同じ時刻のとき、0時間か24時間か

出勤22:00、退勤22:00と入れると、どう扱うべきか。IFの条件を F8<E8 にすると0時間、F8<=E8 にすると24時間になる。MODは0時間を返す。

テンプレートは <= で、24時間として扱う。手元で確かめると実働24、残業16、深夜7と出た。理由は、実際の勤怠で「同じ時刻」が入るのは、24時間勤務か入力ミスかのどちらかで、どちらも0時間より24時間と出たほうが目に付くからだ。残業16時間の行は集計で必ず引っかかる。0時間だと、入力ミスがそのまま通る。

ここは職場で決めることで、式の正しさの問題ではない。0時間にしたいなら <=< に変える。どちらにするかを、表のどこかに書いておく。

深夜の時間は「2つの窓との重なり」で出す

深夜(22時から翌5時)の時間は、勤務の区間と深夜の区間が重なる長さだ。2つの区間の重なりは、終わりの小さいほうから始まりの大きいほうを引き、負なら0にする。式にするとこうなる。

深夜:  =IF(H8="","",ROUND((MAX(0,MIN(IF(F8<=E8,F8+1,F8),設定!$B$7+1)-MAX(E8,設定!$B$6))
                          +MAX(0,MIN(IF(F8<=E8,F8+1,F8),設定!$B$7)-MAX(E8,設定!$B$6-1)))*24,2))

設定シートのB6が深夜の開始(22:00)、B7が終了(5:00)。窓が2つあるのは、勤務が「当日の22時から翌5時」と重なる場合と、「前日の22時から当日の5時」と重なる場合があるからだ。4:00に出勤する早出は後者で、4時から5時の1時間が深夜になる。1つ目の窓だけだと、この1時間が落ちる。

休憩は深夜から引いていない。休憩が深夜帯のどこに入ったか分からないので、引かずに多めに出す側に倒してある。22:00から7:00で休憩60分なら、実働8時間、深夜7時間。休憩が深夜帯に入ることが分かっている職場なら、深夜の結果から休憩を引く列を足す。

残業は「実働から所定労働時間(設定のB5、既定は8)を引いて、負なら0」。休日の勤務は残業に数えず、休日労働の列に実働がそのまま入る。週40時間を超えた分の計算はしていない。

8つの場合を入れた結果

出勤〜退勤、休憩 実働 残業 深夜
22:00〜7:00、60分 8 0 7
20:00〜2:00、60分 5 0 4
4:00〜13:00、60分 8 0 1
9:00〜18:00、60分 8 0 0
22:00〜22:00、0分 24 16 7
9:00〜25:00、60分 15 7 3
23:30〜0:30、0分 1 0 1
21:00〜6:00、90分 7.5 0 7

9:00〜25:00の行は、退勤に「25:00」と打った場合だ。Excelは25:00を1日と1時間(1.0417)として持つので、退勤が出勤より大きく、1を足す条件に入らないまま16時間、休憩を引いて15時間になる。深夜は22時から25時の3時間。翌日の時刻を「25:00」と書く職場なら、そのまま入れて計算が合う。表示形式は [h]:mm にしておかないと、25:00が1:00と表示されて見た目で混乱する。

時刻のまま足すと、合計が24時間で折り返す

労働時間を「9:00」のような時刻の形式で持って、SUMで足す表を見かける。9:00を3日分足すと27時間だが、表示形式が h:mm だと「3:00」と出る。値は27時間ぶん(1.125)で合っているのに、24時間を超えた分が表示から消える。[h]:mm にすると「27:00」と出る。手元で確かめた。

私のテンプレートが時刻ではなく「8.0」のような時間数で持っているのは、この折り返しを避けるためと、時給を掛ける計算をそのまま書けるからだ。時刻形式で持つ表から移すなら、=H8*24 で時間数に直してから集計する。

丸めは日ごとにやらない

15分単位で切り捨てたい、という相談を受けることがある。式は書ける。7時50分(7.8333時間)なら =FLOOR(H8*4,1)/4 で7.75、四捨五入なら =MROUND(H8,0.25) で同じく7.75。

ただし、日ごとの労働時間を切り捨てるのは、労働基準法上は認められていない。労働局が公開している「賃金計算の端数の取扱い」(昭和63年3月14日 基発第150号)の資料では、1か月の時間外・休日・深夜労働の合計に1時間未満の端数があるときに、30分未満を切り捨て、30分以上を1時間に切り上げる処理は違反として扱わない、とされている。日々の端数を切り捨てる扱いは、この範囲に入らない。2026年9月20日に愛知労働局の資料で確認した。

テンプレートは日ごとにROUNDで小数2桁にしているだけで、切り捨てはしていない。丸めるなら月の合計に対してやる。月の残業合計が12.4時間なら12時間、12.6時間なら13時間。

踏んだ失敗

夜勤の行がマイナスになる式は、AIに数式を頼んだときに返ってきた1回目の式そのもので、AIに数式を頼むときの記事に書いた。依頼文に「22:00から7:00」の例を入れれば防げる。

同じ時刻の行を0時間にしていた頃、24時間勤務の日が0時間で給与計算に回りかけた。翌月に本人からの申し出で気づいた。今の <= にしてから、入力ミスも24時間勤務も、残業16時間の行として月末の確認で必ず目に入る。

15分単位の切り捨てを日ごとにやっていた表を引き継いだことがある。月にすると1人あたり2時間から3時間、労働時間が減っていた。上の労働局の資料を示して、月合計の30分単位に変えた。

時刻形式の合計が「3:00」と出ている月報を見て、実働が3時間しかないと思い込んだこともある。値は合っていて、表示だけが折り返していた。[h]:mm を知っていれば1分で済んだ。

自分の表に移すとき

直すのは、出勤・退勤・休憩の列番号と、深夜の開始と終了を置くセル。深夜の窓の式は、設定のセルを参照しているので、22時と5時を直接式に書かない。職場によって深夜の定義が違うことはないが、所定労働時間は7時間や7.5時間の職場があるので、B5を直す。

出勤と退勤が両方入っているのに実働が空欄なら、日付の列が空いている。実働が24なら、同じ時刻が入っている。深夜が実働より大きいことはないので、そうなっていたら退勤に1を足す条件が壊れている。この3つを見れば、大抵の間違いは見つかる。

出典: 愛知労働局「賃金計算の端数の取扱い(昭和63年3月14日 基発第150号より)」、2026年9月20日確認。

勤怠管理夜勤深夜Excel時間計算MOD残業