TimeRound ( theTime ; increment ; forceUpDn )
Rounds a time field by a time interval and allows optionally forcing the rounding up or down
Average rating: 4.2 (38 votes) Log in to vote
Jonathan Mickelson - Show more from this author |
TimeRound ( "10:24:59" ; "00:10:00" ; "" )
TimeRound ( "00:03:59" ; "00:01:00" ; -1 )
TimeRound ( "03:00:02" ; "01:00:00" ; 1 )
TimeRound ( "03:00:02" ; "01:00:00" ; "up" )
10:20:00
00:03:00
04:00:00
04:00:00
Function definition: (Copy & paste into FileMaker's Edit Custom Function window)
Function: TimeRound ( theTime ; increment ; forceUpDn )
Description: This function rounds a time field by a dynamic incriment
value, with the option to force it to round up or down, or
by default it uses normal rounding. Normal rounding defines
the breakpoint at 50% of the incriment value.
Output Format: a time value representing the rounded time.
See the following examples:
- TimeRound ( "10:25:00" ; "00:10:00" ; "" ) = "10:30:00"
- TimeRound ( "10:24:59" ; "00:10:00" ; "" ) = "10:20:00"
- TimeRound ( "00:03:59" ; "00:01:00" ; -1 ) = "00:03:00"
- TimeRound ( "03:00:02" ; "01:00:00" ; 1 ) = "04:00:00"
- TimeRound ( "03:00:02" ; "01:00:00" ; "up" ) = "04:00:00"
Parameters:
timeField - A time value to round.
increment - A time value representing the interval to round by. A Null, "" or
0 value will use Normal rounding. A positive number will force
the rounding to round up to the next highest increment, a negative
number will force the rounding to drop to the next lowest increment.
forceUpDn - A number value (or one of two thee values; up, dn or down )
representing desired rounding type to be used. A Null, "" or
0 value will use Normal rounding. A positive number, or "up", will
force the rounding up to the next highest increment, a negative
number, or "dn" or "down", will force the rounding to drop to
the next lowest increment.
Author - Jonathan Mickelson
Last Modified: 12/3/2012
- Wrapped both time-based inputs in GetAsTime (), to better type the inputs for the rest of the calc.
- Pre-processing short circuit to bypass empty times so it doesn't force 12:00 am.
Comments
Jeff Hough, Portland, OR Apr 4, 2012 |
||
There is an error in the incr input variable. It should read into the function as date. For example, if you use the function as is with the incr input of "00:10:00" the value of typeAdj will be 500. If the input is GetAsTime ("00:10:00") the value of typeAdj will be 300. This correctly rounds the result. The change is in the initialization of p2. The updated calc appears below: // TimeRound ( theTime ; incriment ; forceUpDn ) Let ( [ p1 = theTime ; p2 = GetAsTime ( incriment ) ; // <-- THIS IS THE UPDATED PART - JH p3 = Lower ( ForceUpDn ) ; time = p1 ; inc = Case ( IsEmpty ( p2 ) ; GetAsTime ( "00:00:01" ) ; p2 ) ; type = Case ( IsEmpty ( p3 ) ; 0 ; Substitute ( p3; [ "up" ; "1" ] ; [ "dn" ; "-1" ] ; [ "down" ; "-1" ] ) ) ; typeAdj = Case ( type > 0 ; inc * .99999999 ; // Round Up type < 0 ; inc * 0 ; // Round Down type = 0 ; inc * .5 // Round Normal ) ; rnd = ( Int ( ( time + typeAdj ) / inc ) ) * inc ; result = GetAsTime ( rnd ) ] ; Case ( not IsEmpty ( time ) ; // RESULT result ) // END CASE ) // END LET |
||
Jonathan, Van Nuys, CA Dec 3, 2012 |
||
Thanks Jeff, I always tend to use this with actual Time fields, so I'd never run into that! I've updated the calc and wrapped both time-based inputs in GetAsTime (), since both require time values. Best, Jonathan |
||
Israel Golding, Lakewood, NJ Jun 3, 2015 |
||
NOTE: you have "increment" misspelled! | ||
Note: these functions are not guaranteed or supported by BrianDunning.com. Please contact the individual developer with any questions or problems.