Mark,
You got me intrigued and I have put some thought into this.
I did not have time to completely flesh this out let alone create a BSV, but here is the general idea. This may be similar to what PointsWell was thinking.
Create a BO with the following attributes
TimeStamp StartTime
TimeStamp EndTime
Timestamp TempStart
TimeStamp TempEnd
Yes/No Done initially set to No
Duration WorkDuration
Yes/No isStartDayShift
Yes/No isEndDayShift
The user enters their StartTime and EndTime
The following rules are on the BO
1) Set TempStart to StartTime
2) Set TempEnd to EndTime
3) Set WortDuration to EndTime - StartTime
4) If StartTime is in the Day shift set isStartDayShift to Yes Else set it to No
5) if EndTime is in the Day Shift set isEndDayShift to Yes Else set it to No
6) if WorkDuration <= 12 Hours and isStartDayShift = IsEndDayShift (The StartTime and End Time are in the same shift) Then Create a shift record with the start time = StarTime and end time = EndTims, Set Done to Yes
7) If Done = No and the time part of StartTime <> SystemSettings Day shift Start or Night Shift Start (the start time is not on a shift boundary and a partial shift record is needed) Then Create a shift record with start time = StartTime and end time = the end time of the shift. Set TempStart to the end of shift time
8-) If Done = No and the time part of EndTime <> SystemSettings Day shift Start or Night Shift Start (the end time is not on a shift boundary and a partial shift record is needed) Then Create a shift record with start time = start of the shift time and end time = EndTime. Set TempEnd to the START of the shift time
9) (At this point, TempStart and TempEnd should both be on a shift boundary time) If Done = No and TempStart <> TempEnd Then Create a shift record with start time = TempStart and end time = TempStart + 12 hours. Increase TempStart by 12 Hours. (here is the magic) on the advanced tab for this rule, select the While Semantics box so that this rule will continually execute until TempStart = TempEnd and all of the shift records have been created.
Hope my pseudo code makes sense.