24時間稼動しているガソリンスタンドの勤怠管理をVB2013で作成しています。
1日の実働時間中に深夜時間帯が何時間含まれているかを判断したいのですが
良いロジックが浮かばなくて困っています。
条件としては以下の内容です。
深夜時間帯開始時刻:22:00
深夜時間帯終了時刻:06:00
勤務形態は完全なシフト勤務で勤務開始時刻、終了時刻は決まっていません。
勤務開始時刻が深夜時間帯になる場合、勤務終了時刻が深夜時間帯になる場合
勤務開始時刻、勤務終了時刻が深夜時間帯をまたぐ場合
1日の実働時間全てが深夜時間帯になる場合などがあります。
過去に同様のロジックを作成したことのある方や、解決方法をご存知の方は
返信お願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
以前、この「教えて!goo」で回答用に作成したものです(回答を投稿する前に締め切られてしまいましたが…)。
ちょっと冗長的なコーディングですが、シンプルなロジックにしたつもりです。
関数で実装しています。引数は開始時刻St、終了時刻Etで、戻り値が深夜勤務時間です。
深夜時間として、当日0:00~5:00、当日22:00~翌日5:00、さらに、翌日22:00~24:00(翌々日0:00)の時間を合計しています。
Function Midnight(St As Variant, Et As Variant) As Variant
Dim MidStart As Variant
Dim MidEnd As Variant
'当日0:00~5:00の勤務時間を求め、加算する。
MidStart = TimeValue("00:00:00")
MidEnd = TimeValue("05:00:00")
If Not (St >= MidEnd Or Et <= MidStart) Then
If MidStart < St Then MidStart = St
If MidEnd > Et Then MidEnd = Et
Midnight = Midnight + MidEnd - MidStart
End If
'当日22:00~翌日5:00の勤務時間を求め、加算する。
MidStart = TimeValue("22:00:00")
MidEnd = 1 + TimeValue("05:00:00")
If Not (St >= MidEnd Or Et <= MidStart) Then
If MidStart < St Then MidStart = St
If MidEnd > Et Then MidEnd = Et
Midnight = Midnight + MidEnd - MidStart
End If
'翌日22:00~同24:00(翌々日0:00)の勤務時間を求め、加算する。
MidStart = 1 + TimeValue("22:00:00")
MidEnd = 2 + TimeValue("00:00:00")
If Not (St >= MidEnd Or Et <= MidStart) Then
If MidStart < St Then MidStart = St
If MidEnd > Et Then MidEnd = Et
Midnight = Midnight + MidEnd - MidStart
End If
End Function
No.3
- 回答日時:
datetime型でも問題はないけど、、、
vb系では意外と日付取り出したり、もどしたりするのが、面倒というか長い記述になるのでストリングで処理したほうが楽なような気もする。
年、月、日、時、分を別なフィールドに突っ込んでいるシステムも見たことがある。コボル時代のなごりなのかもしれないけど。
ShowMeHowさん
返信有難う御座います。
確かにVB6の時代から、日付や時刻の扱いは面倒くさい処理を行っていましたね。
いろいろ試している中では、datetimeやtimespanなどを使用できないかと考えています。
マイクロソフトには日時をもう少し簡単に扱えるような関数を追加して欲しいものです。
No.2
- 回答日時:
私の時の条件は、深夜回数を求める物でしたが、以下の時間帯に勤務していたら
深夜回数を求める物でした。この考えを置き換えれば、勤務時間を求められると思います。
例)
22時過ぎ~0時まで:0.5回
0時過ぎ~3時まで:1.0回
3時過ぎ~5時まで:0.5回
【私の考え方】
①出勤時間と退社時間を比較し、その大小によりロジックを分ける。
②出勤時間・退社時間の関係が、上の時間帯に当てはまるかどうか判定
【ソースは、こんな感じ】
If dec出勤時刻 < dec退社時刻 Then
'通常開始勤務で
If dec出勤時刻 < dec深夜判定時刻03H Then
dec自動計算深夜回数 = 1
ElseIf dec出勤時刻 >= dec深夜判定時刻03H And dec出勤時刻 < dec深夜判定時刻05H Then
dec自動計算深夜回数 = 0.5
ElseIf dec退社時刻 > dec深夜判定時刻22H Then
dec自動計算深夜回数 = 0.5
End If
ElseIf dec出勤時刻 > dec退社時刻 Then
'0時を回る勤務をしたら
If dec出勤時刻 < dec深夜判定時刻03H Then
dec自動計算深夜回数 = 1
ElseIf dec退社時刻 > dec深夜判定時刻00H Then
dec自動計算深夜回数 = 1
ElseIf dec出勤時刻 >= dec深夜判定時刻03H AndAlso dec出勤時刻 < dec深夜判定時刻05H Then
dec自動計算深夜回数 = 0.5
ElseIf dec退社時刻 = dec深夜判定時刻00H Then
dec自動計算深夜回数 = 0.5
End If
End If
ghost305jpさん
返信有難う御座います。
長文のロジックを書き込んでいただき有難う御座います。
もう少し簡単に考えていましたが、結構大変なロジックになりそうです。
頂いたソースを解析し、時間取得に変更してみます。
No.1
- 回答日時:
勤務開始日 勤務開始時間 終了日 終了時間
を打刻レコードに含め、
① 勤務開始時間が深夜時間帯の場合
② 深夜時間帯が勤務途中から始まっている場合
に分けて算出する。
勤務時間が5AM~11PMのような可能性があるなら、
①と②をそれぞれ計算して足してやる必要がありますね。
労基法に違反してそうな気もしますがね。
ShowMeHowさん
返信有難う御座います。
時刻だけではなく日付を付加する事で時刻の大小を判断するのですね。
処理は分割して行うほうが良さそうですが、法的な事までは考えていませんでした。
再度、相手先への確認が必要そうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
誕生日にもらった意外なもの
みなさんがもらった誕生日プレゼントで面白いものがあったらぜひ教えてください!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
時刻の比較
Visual Basic(VBA)
-
vba 時間の引き算 例えば 15:00から16:15の間の時間は1時間15分ですが、vbaのコード
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB2010で、時刻と時間の計算に...
-
Accessのクエリの値を変換(代入...
-
Designer.vbは直接コードをいじ...
-
印刷ダイアログを表示させない方法
-
「読み込み違反」が起きたとき...
-
vba 時間の引き算 例えば 15:00...
-
Visual Studio 「AnyCpu」について
-
VB6(SP5)+OO4OでCreateObjectが...
-
C#ソースをCSCファイルにてコン...
-
VBSから別のVBS起動するとき変...
-
アウトルックが起動しているか...
-
Windows PowerShellでC言語を実...
-
ManagementClassが見つからない。
-
EXCEL VBAから他アプリケーショ...
-
デザインタブが表示されない
-
[VB.net] ExcelへのQRコード出...
-
MS Visual Studio 6.0のEnterpr...
-
ディストリビューションウィザ...
-
意味不明の実行時エラーで困っ...
-
VB6.0 exe作成時に実行時エラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのクエリの値を変換(代入...
-
カラーコード 濃くしたい
-
VB2010で、時刻と時間の計算に...
-
単位計算のアルゴリズム
-
画像を二次元フーリエ変換
-
経過日数を調べたい
-
Matlabで群遅延特性
-
時間領域と周波数領域
-
DateDiff関数の怪!?
-
matplotlibで任意の角度の円弧...
-
VBで時間計算の方法
-
グリッドの使い方について
-
ウェーブレット変換に関して
-
擬似マインスイーパー
-
電卓の作成 VB
-
世界測地系から東京測地系へ変換
-
Visual Basicで多角形を描くプ...
-
階乗の逆数を計算するFunction...
-
FORTRANの課題
-
vba 時間の引き算 例えば 15:00...
おすすめ情報