How to check if a specific time falls in between 2 times in Excel? - excel

I used this formula IF(AND(C2>=MIN(A2:B2),C2<=MAX(A2:B2)),"Within Shift","Post Shift"). In the image attached the shift is 5pm to 2am, but the comments comes as post shift. Since Excel consider time as 24 hrs the comment comes out as "Post Shift" is there a way to fix this? Please help.

Your formula is based on the idea that both times are within the same day, which is not true in the last case (the shift end time is on the next day).
In order to solve this, it might be useful to realise that datetime values in Excel are based on the idea that one day is equal to the value 1.
So, in case B2 is smaller than A2, you might need to replace the usage of B2 by the usage of B2+1 (the same time, but the next day), so your formula becomes something like (multiline for readability purposes):
=IF(A2<B2,
<use your formula, based on B2>,
<use your formula, based on B2+1>)
The second part, about using your formula, based on B2+1, this means something like:
IF(AND(C2>=MIN(A2:B2+1),C2<=MAX(A2:B2+1)),
"Within Shift",
"Post Shift")

Possible solution:
=IF(AND(IF(C2>=A2,C2,C2+1)<=IF(B2>=A2, B2, B2+1)), "Within Shift", "Post Shift")
The underlying assumption is that column C is always greater than column A.
Offline time could either be prior the start of shift or after the end of shift. Example: Assuming start of shift 07:00 AM and end of shift 04:00 PM and off time at 02:00 AM. We can either interpret 02:00 AM to be prior to 07:00 AM or to he next day after 04:00 PM. There is no way to solve the ambiguity. The safest bet is to assume the off time is always after the start of shift. As such, since 02:00 AM < 07:00 AM, we add 1 day and compare the result to the end of shift. Same applies to end of shift, if it seems to be prior to start of shift, we add 1 day to it prior to comparison.

Here's a different approach to the existing answers:
=IF(MOD(1+C2-A2,1)=MIN(MOD(1+C2-A2,1), MOD(1+C2-B2,1)), "Within Shift", "Post Shift")
Basically, it takes the "target" time (Shift End or Offline Time), adds 24 hours (1 day), subtracts the Shift Start Time, and fits it inside a day (i.e. if the result is over 24 hours, keep subtracting 24 hours until the time is less than a day)
This will give you either the length of their shift, or how long they were online (depending on which is the "target time").
We then use MIN to find out which of these two times were shorter, and then compare that to the Time Spent Online. If they are the same, then they went offline within their shift. If they are different, then they went offline after their shift.
Note that if they go offline exactly at shift-end, this will be counted as "Within Shift". If you want this to be "Post Shift", then change the MIN to MAX, and swap the two labels

Related

Calculate if time period is contained within a start and end time

I have a problem where I am trying to calculate in Excel if any part of a provided work duty time period is contained within a user defined period which specifies the night working hours e.g. 2330-0559 or 0000-0630.
If I provide a work duty time I want and any part of the duty is within the specified period it needs to be identified. E.g. 2230-0630 duty time is within both examples above.
I can tried a few different solutions and still not got the right way solve it.
Maybe someone can help. I also know that 24:00 in excel is used for midnight at the end of the day and 00:00 is used for midnight starting the day as excel works from 0-1 as part of the day.
=OR(MOD(A5,1)>$E$2,MOD(A5,1)<$F$2)
I would work with the number of minutes as decimal and with it make a valid range from "Duty start time" and "Duty end time".
Check if you can make any sense out of this:
Here the example:
https://drive.google.com/file/d/1O1B76srlY8sYQHsV_TiZVzi-7B_18eSj/view?usp=sharing
Update: Sorry for the lack of explanation. Here I try my best to clarify how I did it.
Conversion
First of all I try to convert any time into minutes, so 00:00 is 0 minutes, 01:00 is 60 minutes, 24:00 (excel shows 00:00) is 1440 minutes, 25:00 (excel shows 01:00) is 1500 minutes.
That conversion I do with CONVERT(E2,"day", "mn"), which does convert from day to minutes.
Range Normalization and inclusion
Now every range has to be normalized, that means the "End" has to be always bigger than "Start". For 00:00 to 06:00 this works fine, but for 22:00 to 06:00 it needs to be tweaked. So if "Start" is bigger than "End" then I add 1440 mins (24 hours) to "End". That I do with IF(A6>B6, 1440,0).
You then need to see if any "Duty range" contains the "Night range". That normally is done with the formula if (DutyEnd > NightStart AND DuttyStart < NightEnd) then TRUE.
Challenge 1
That was the main concept. But then if you try to compare a range like 00:00-06:00 contained in 24:00-06-00 it does not work. And that is because the converted minutes are 0-360 and 1440-1830, they don't contain each other.
In E3 to fix this I cut down 1440 with modulo (MOD()), then MOD(1440, 1440) = 0. So even if you use values like 25:00 or 52:00, they will be cut down to the smallest amount of minutes. E.g. 25:00 (1500 mins) = 1:00 = 60 mins, 52:00 (3120 mins) = 4:00 = 240 mins
Challenge 2
We have yet another challenge, the possible comparisons are as follows:
00:00-06:00 contained in 00:00-06:00 which in minutes is 0-390 contained in 0-390
00:00-06:00 contained in 22:00-06:00 which in minutes is 0-390 contained in 1320-1830
22:00-06:00 contained in 00:00-06:00 which in minutes is 1320-1830 contained in 0-390
These last two will not match. So that is why in the "Contains" column (E.g.: E6) I compare against the "Night criteria" - 1400 and + 1400.
Hope it is a bit clear. Let me know otherwise..
UNDERSTANDING DATE AND TIME IN EXCEL
Dates in excel are stored as INTEGERS. They represent the days since 1900/01/1 with that date being 1.
Time is stored as a decimal which represents a fraction of a day. 24 hours is 1, 0.5 is 12 noon. etc.
In other words, everything to the left of the decimal is date and everything to the right is time.
JUST USING TIME AND CROSSING MIDNIGHT
This is problematic from the view point that early morning times are less than the late times of the previous day. The fact of the matter is that they are larger. In our heads we do the mental math of knowing the are the following day but we ignore the date aspect.
A quick way to rectify this is to add the date to your time. Life will become much easier with the math. You may however not want to add full dates to start and end times. WITH THE ASSUMPTION that start and end times are not more than 24 hours the simple work around is is to add 1 to the end time when the end time is less than the start time. This means its the next day.
It the example date you provided, column C was insert to CORRECT the end time. It did the check of end less than start if so add one using the following formula:
=B6+(B6<=A6)
The part in brackets is a logic check. It either evaluates to TRUE or FALSE. When excel runs a boolean (TRUE or FALSE) through a math operator (not a function like sum) it will convert TRUE to 1 and FALSE to 0.
LENGTH
Straight forward math of C minus A since C is always after you start and is the larger of the two numbers.
=C6-A6
CROSSING MIDNIGHT
Need to be a little careful in your definition of crossing midnight when a start time or end time is exactly midnight. Technically speaking you did not cross it if you start or stop on it. The difference is really < versus <= or > versus >=. I will leave that to you to sort out. For the math I used:
=AND(A6<1,C6>=1)
Though I did not use this column for anything else
START CHECK
=OR(A6>$F$2,A6<$G$2)
END CHECK
=OR(B6>$F$2,B6<$G$2)
ANY TIME CHECK
I broke this into three columns. It can be combined into one but wanted to show the working parts. The first check is to see if the start time is before the night start and that the shift end time was after the night start time. The second check was similar for the the fisrt except you want to know if the start time is before the night end time and the shift end time is after the night end time. For the OR case you want to check to see if ANY of columns F through I are true:
COLUMN H
=AND(A6<=$F$2,C6>$F$2)
COLUMN I
=AND(A6<$G$2+1,C6>$G$2+1)
Note the +1 for night end time. This is to reflect that the end time is actually on the following day.
COLUMN J
=OR(F6,G6,H6,I6)
or
=(F6+G6+H6+I6)>=1
Place the above formulas in row 6 and copy down as needed
Well, I think I'm missing something but let's see if this works for you. To make this work:
All hours must be typed in hh:mm format
Night Criteria End must be on a different day. This means it must be over 00:00 or formulas won't work. If you type something
like start criteria=22:00 and night criteria= 23:50, both times
would be in the same day, so formulas won't work
This formulas only work in periods less than 24 hours. If anytime the different between criterias is over 24 hours, formulas won't work
properly.
Now, I replied your data like this:
The trick here is dealing with times without dates. Dates in Excel are înteger numbers and decimal parts are the hours/minutes/seconds. So to compare properly hours like this, you need to add an integer part.
Let me explain. In Excel, 18:00 would be 0,75. And 06:00 would be 0,25. If you try to get the difference between both times, you will get -0,5. In decimal it makes sense, but when trying to convert to time, it makes no sense for Excel. So, as I said before, the trick here is adding integers (in this case, because 06:00 is lower than 18:00, we would add +1), so Excel would make 1,25 - 0,75 = 0,5. And Excel can convert 0,5 to hours, and it will return exactly 12 hours, the right result.
So knowing this, the trick in formulas for your data is comparing ends with starts and add 1 or 2 to compare then properly with your criteria. That way Excel can figure out if a time is later or sooner than a criteria.
All my formulas are these ones:
LENGHT: =IF(B5<A5;B5+1-A5;B5-A5)
CROSS MIDNIGHT: =IF(Y(B5<A5;B5<>0);TRUE;FALSE)
START BETWEEN CRITERIA: =IF(AND(IF(A5<$E$2;A5+2;1+A5)>=1+$E$2;IF(A5<$E$2;A5+2;1+A5)<=$F$2+2);TRUE;FALSE)
END BETWEEN CRITERIA: =IF(AND(IF(B5<$E$2;B5+2;1+B5)>=1+$E$2;SI(B5<$E$2;B5+2;1+B5)<=$F$2+2);TRUE;FALSE)
ANY PART:=IF(OR(E5=TRUE;F5=TRUE;AND(A5<$E$2;A5+C5>1+$F$2));TRUE;FALSE)
Anyways, I uploaded a file to my Gdrive, in case it may be helpful to download and check the formulas.
This is the best I got. Probably there is a better way, but I hope this can help you, or at least, you can adapt it to your needs.
https://drive.google.com/open?id=1nrZKfyUhED_y6iiPRSUwRf7GhJlBYt-O

Excel IF AND formula between two times

I would like to have a formula which will tell me if a time in a cell is between 2 separate vlaues in other cells and to return a value if so.
I have already created the below code but this is not returning any values back at all.
=IF(AND(F4>=$R$1,F4<P1),"Night Shift",IF(AND(F4>=$P$1,F4<$Q$1),"AM Shift",IF(AND(F4>=$Q$1,F4<$R$1),"PM Shift","")))
In this example the cell values are (P1 = 06:00, Q1 = 14:00, R1 = 22:00). The value in the F4 is 00:31:38.
Any help would be appreciated.
Your first AND needs to adjust a little.
Excel sees TIME as a fraction of 1 whole day. So 00:31:38 though you meant it to be the next day from 22:00, Excel does not know that and as such will not see it greater than 22:00
We also do not need to test for the Night Shift. It is the only option left if the time is not in one of the others:
=IF(F4<>"",IF(AND(F4>=$P$1,F4<$Q$1),"AM Shift",IF(AND(F4>=$Q$1,F4<$R$1),"PM Shift","Night Shift")),"")
You could also create a small table like such:
0 6:00 14:00 22:00
Night Shift AM Shift PM Shift Night Shift
Then use a HLOOKUP to return the correct value:
=HLOOKUP(F4,O1:R2,2,TRUE)
I took a slightly different path that Scotts.
A Night Shift occurs if the time is greater or equal to 10PM, OR is less than 6AM.
=OR($F$4<$P$1,$F$4>=$R$1)
An AM Shift occurs when the time is greater or equal to 6AM, AND is less than 2PM.
=AND($F$4>=$P$1,$F$4<$Q$1)
A PM Shift occurs when the time is greater or equal to 2PM, AND is less than 10PM.
=AND($F$4>=$Q$1,$F$4<$R$1)
Stick the three conditions together and you have:
=IF(OR($F$4<$P$1,$F$4>=$R$1),"Night Shift",IF(AND($F$4>=$P$1,$F$4<$Q$1),"AM Shift",IF(AND($F$4>=$Q$1,$F$4<$R$1),"PM Shift","")))
Edit
During testing I entered 00:00:00 in A1 and =A1+TIMEVALUE("00:01:00") in A2:A1440.
At 06:00:00, 14:00:00 and 22:00:00 the changeover in shift happened a minute later.
If, however, I manually typed in 06:00:00 the changeover happened on the hour. This seems to be because TIMEVALUE is calculating 6AM as 0.2499999 rather than 0.25.
=IF(OR(HOUR(NOW())>22,HOUR(NOW())<7),"NIGHT","")&IF(AND(HOUR(NOW())>6,HOUR(NOW())<15),"MORNING","")&IF(AND(HOUR(NOW())>14,HOUR(NOW())<23),"LATE","")
I know a bit late but simplifies everything without the need of using other cells (note there are different times used).
Night - 23-07
AM - 07-15
PM - 15-23

Excel: Comparing Times to get minutes apart

I'm trying to get the + and - between two times but if the time I am subtracting from is greater than the time I am subtracting it gives me the difference in 24 hours.
I would like it to show this:
Perhaps this needs to be done in VBA. Have column B be the time to compare to and put max time apart as 12 hours, either positive or negative. So if the time is different by over 12 hours it becomes a negative instead of positive or vise-versa?
#tysonwright that is the best way to do it. Thanks. I assumed there was a better process but apparently there is not. So with that, I change the date to the next day to get 23:59 to 0:01.
If your clockin is in A1 and your Schedule is in A2, your Difference should be:
=IF(A1>B1,TEXT((A1-B1),"-h:mm"),TEXT((B1-A1),"h:mm" ))

calculating overtime hours in excel

I'm trying to make spreadsheet that calculate overtime hours as the following:
If the task started after 2pm the hour is calculated as an hour and a half
if the task started after 12 am the hour is calculated as 2 hours
I wrote the following formula in column E:
=IF(AND(B5>G1;B5<G2);D5*D1;D5*D2)
but I get false results where did I went wrong?
thank you
The problem with your formula is that you are thinking of 12:00 AM as midnight. or 24:00. If you look at G2 you will see 12:00 AM or (24:00) in Excel it is stored as 0. You logical check is checking to if anything is less than zero. Assuming that you are never dealing with negative time your result will always be false as no time is less than zero.
I would change your layout a bit and add a shift 3 where there is no overtime. What happens when someone starts at 9 AM?
IF you have to keep your layout as is, I would change your formula in cell D5 to read:
=HOUR(C5-B5)
And then make sure cells D1,D2,D5 and E5 are all general format since they are just numbers and not actual time.
Next set G2 equal to 08:00
change your formula in E5 to:
=IF(B5<G2,D5*D2,IF(B5>=G1,D5*D1,D5))
or
=D5*IF(B5<G2,D2,IF(B5>=G1,D1,1))
See if that gets you any further.
One thing to watch out for is that Excel stores time in a decimal format which can really throw you off. You may think your are dealing with 12 when you see 12:00 PM in a cell, but what excel really has stored in that cell is 0.5 as it is half way through the day. 24:00 does not exist Excel formulas will treat it as 0 if it is supplied as an input for formulas. VBA will not accept it. Valid Excel times range from 00:00 to 23:59.
now having said this if you are looking strictly at 8 hour shifts and are only concerned about start times, you could simply do an if statement saying IF(start time = shift 1 start time, then multiply by shift 1 rate, IF( start time = shift 2 start time, then multiply by shift 2 rate, no special rate))
something else to consider, if you are looking at actual start times, and a person starts in one shift but finishes during the next shift what happens?

Start/End Times falling in ranges (and crossing over midnight)

I have a data set with start times in column B and end times in column C. I am currently using a sumproduct formula (=SUMPRODUCT(($B2<"07:00")*($C2>="07:59"))) to determine if the start/end time falls within time ranges (i.e. 07:00 to 07:59, 08:00 to 08:59, etc.). In the sumproduct formula the times are just examples (I will fill those with times in numerical format).
I have seen the sumproduct before and it's tried and tested, but I have yet to find a formula that does all of this AND accounts for if the start time is prior to midnight but the end time is after midnight.
The data set is for an event running from start to finish, and I ultimately want to determine what time ranges that event is running in by placing a 0/1 if the event is running in any given time interval.
My only fix to date is applying the sumproduct formula and then filtering on occurrences that cross over midnight and adapting the formula accordingly.
Any help with this would be greatly appreciated. Thank you in advance for your time.
First off I don't think you need sumproduct as you are not dealing with any sort of range that need summing so you could shorten your formula to ($B2>"07:00")*($C2<="07:59"). Note I also reversed the signs so it is actually between 7:00-7:59, also the formula won't work unless the 07:00 and 07:59 are stored in a cell because as written it is comparing a number to a text string and won't return the correct value.
For your actual question you need a second part to your function
=if(end<start,(B2<end)+(B2>start),(B2>start)*(B2<=end))
If the end time is less then the start time assume it goes past midnight so your time needs to be either after the start time or before the end time. If it does not go around midnight it has to be between them both.
Consider using a half open interval [Start,End) such that your ranges are 07:00 to 08:00, 08:00 to 09:00, etc.
This has the advantage of not skipping values like 07:59:30.
It also lets you do simple subtraction to get 1 hour instead of 59 minutes for the duration of the range.
Compare against the start of the range using <= or >= (depending on how you express it), but compare against the end of the range using < or >.
For time-only ranges that span midnight, you can just test to see if the value falls after the start or before the end.
Here is a complete formula. Replace [start], [end], and [value] as necessary.
=IF([start] <= [end], AND([start] <= [value], [value] < [end]), OR([value] >= [start], [value] < [end]))

Resources