Need to calculate end time in hours and minutes

I need to calculate what the time will be 7.6 hours after the start time, allowing for breaks taken. The following formula rounds my 7.6 hours to 8 hours. How do I get it to work out 7.6 hours or 7 hours 36 minutes after the start time?

0:07:36 +
MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
+SUM( SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )

Solved Solved
0 13 635
1 ACCEPTED SOLUTION

Hi @Griff

Thank you , but I believe there was a typo in my suggestion. For adding 7 hours 36 minutes please try

โ€œ007:36:00โ€ +
MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
+SUM( SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )

With earlier suggestion โ€œ000:07:36โ€, I believe it adds 7 minutes 36 seconds.

View solution in original post

13 REPLIES 13

Hi @Griff,

I believe if you mention some more details, it will help in suggesting a suitable approach.

  1. In the expression what โ€œ0:07:36โ€ stand for? is it the start time? If so from where it is coming and what type of column it is.
  2. The type of [Start] and [Break] columns and finally what is the column type where the expression itself resides.

Hi Suvrutt, sorry if i was too unclear.

Our employees work a 38 hour week, so after 7.6 hours or 7:36 minutes their pay structure changes. What I need to do is work out is what time their base hours end.

This formula is intended to calculate that end time and assign it to a Time type variable called [End].
[Start] is the time the shift started (Time type field).
[Break] is a duration type field.

So the [End] time should be 7.6 hours plus the sum of any [Break]'s after the [Start] time. My formula assigns the value to a Time field but it seems to round 7.6 hours to 8 hours

Hi @Griff,

Thank you.

Please try with

โ€œ000:07:36โ€ +
MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
+SUM( SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )

I am always amazed at how quickly you can solve these problems. Thank you for your assistance. That solved my problem.

However I have now tried to insert that formula in the Initial value of [End] encapsulated in a IFS([Type]<>โ€œOrdโ€โ€ฆ and it doesnโ€™t work. Does this formula create a Time valiable or do I need to do something else to make it work that way.

Hi @Griff

Thank you , but I believe there was a typo in my suggestion. For adding 7 hours 36 minutes please try

โ€œ007:36:00โ€ +
MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
+SUM( SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )

With earlier suggestion โ€œ000:07:36โ€, I believe it adds 7 minutes 36 seconds.

You may wish to share more details on your latest expression.
Yes, on your query, if one is adding durations ( โ€œ007:36:00โ€ and [Break] ) to a time column, [Start], then I believe the result will be a time value.

Hi Suvrutt, Iโ€™ve done more investigation and found how to make it work, kind of, and have given up looking for a solution using this approach. Nevertheless, thanks for your advice, leading me to better understand things.

By way of background, our standard day is 7.6 hours. Each day an employee can enter one or more shift segments including the following fields, Date/Employee/Start/End/Type. Generally, one Shift segment of Type = โ€œOrdโ€ is all they need so their BaseEndTime is 7.6 hours after they start. However, there may be occasions when they need to enter a second shift segment, e.g. Type = โ€œSickโ€. In that case they will still be entitled to Base Pay up to 7.6 hours after they started work that day. The idea, therefore, is to work out when 7.6 hours after either their actual start time (possibly a previous shift segment) or the default start time of 7:00 AM

Unfortunately Date, Time and Duration calculations and conversions in Appsheet are so much more complicated than I am used to. In MS Access dates are stored as declimals where the whole number is number of days from 1/1/1900 and the decimal component is decimal part of a day. That makes calculations relatively straightforward and formatting options make the display meaningful and easy to apply.

AppSheet date handling requires a mind-shift for me that I still havenโ€™t grasped. In this case I tried creating a new Virtual Field called BaseEndTime using the following formula. I then used that field value in in the Initial Value of my [End] field. Itโ€™s not working correctly for some reason, however I am giving up because the overhead of the repeated Select statement is not worth carrying. I think I am better off trying to work out another way.

โ€œ000:07:36โ€ +
If(MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
=Time(โ€œ000:00:00โ€)
,MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
,Time(โ€œ000:07:00โ€))
+SUM( SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )

Hi @Griff,

Thank you for a crisp details.

II believe the above expression needs some changes as below for correct operation

  1. You have currently used โ€œ000:07:36โ€ which adds 7 minutes 36 seconds, Please use instead โ€œ007:36:00โ€ which will add 7 hours 36 minutes. I have mentioned that in my previous post.

  2. For comparing time type column with a constant time , I believe you need not wrap it with TIME() as you have done, Time(โ€œ000:00:00โ€) . So simply please use โ€œ00:00:00โ€

  3. For time TIME("000:07:00) , please use instead "07:00:00"

In AppSheet, I believe duration constant value needs to be preceded with an extra 0 , so duration of 7 hours is โ€œ007:00:00โ€ but time of 7 AM is โ€œ07:00:00โ€

So overall, you may wish to test your expression as below with changes highlighted

โ€œ007:36:00โ€ +

IF(

MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
=โ€œ00:00:00โ€
,MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
, "00:07:00โ€
+SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) )

)

Removed SUM() from last part. I believe, you may not need it if [Break] is duration type.

Now about decimal math on time, there are a few functions in AppSheet that you may wish to take a look at , just in case you have not

Thanks. I didnโ€™t know about the leading zero but it certainly makes it easier to understand. I will have a look at the suggested links you provided to see if I can better understand.

As for the suggested solution, I get this error message, but I donโ€™t understand it. If I figure out how to get it working, do you think it adds too much unnecessary overhead by effectively running the same select statement twice? I thought Select statements like this were very resource hungry and should be avoided?

Arithmetic expression โ€˜(โ€œ12/30/1899 12:07:00 AMโ€+SELECT(Timesheets[Break],AND(([Worker] = [_THISROW-1].[TimeKey].[Worker]), ([Work Date] = [_THISROW-1].[TimeKey].[Work Date]))))โ€™ has inputs of an invalid type โ€˜Unknownโ€™

Could you please share the column configuration details and a few values of [Break]?

Also you still seem to be using โ€œ00:07:00โ€ instead of โ€œ07:00:00โ€ Because โ€œ12/30/1899 12:07:00 AMโ€ indicates somewhere 7 minutes are getting added instead of 7 hours.

It may be difficult to diagonise SELECT(Timesheets[Break],AND(([Worker] = [_THISROW-1].[TimeKey].[Worker]), ([Work Date] = [_THISROW-1].[TimeKey].[Work Date])))) with other expression.

You may wish to test it in isolation to ensure it is producing an output type duration.

Persistence paid off. The following works. However if I remove the SUM() from the Break part of the formula I get an error message. The key to this, as pointed out in your earlier post, is understanding that Duration has an extra leading zero. I am assuming that, since you helped me persevere with this, you donโ€™t necessarily think it adds an onerous overhead.

Thanks again for your help.

โ€œ007:36:00โ€ +
If(MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
=โ€œ00:00:00โ€
,MIN( SELECT( Timesheets[Start], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )
,โ€œ07:00:00โ€)
+SUM( SELECT( Timesheets[Break], AND([Worker]= [_THISROW].[Worker], [Work Date] = [_THISROW].[Work Date] ) ) )

Arithmetic expression โ€˜((โ€œ07:36:00โ€+IF((MIN(SELECT(Timesheets[Start],AND(([Worker] = [_THISROW-1].[TimeKey].[Worker]), ([Work Date] = [_THISROW-1].[TimeKey].[Work Date])))) = โ€œ12/30/1899 12:00:00 AMโ€),MIN(SELECT(Timesheets[Start],AND(([Worker] = [_THISROW-1].[TimeKey].[Worker]), ([Work Date] = [_THISROW-1].[TimeKey].[Work Date])))),โ€œ12/30/1899 7:00:00 AMโ€))+SELECT(Timesheets[Break],AND(([Worker] = [_THISROW-1].[TimeKey].[Worker]), ([Work Date] = [_THISROW-1].[TimeKey].[Work Date]))))โ€™ has inputs of an invalid type โ€˜Unknownโ€™)

You are welcome. Excellent to know it finally works the way you want.

Please do test well for all possible edge test cases as per your requirement.

Top Labels in this Space