Hour Breakdown
Hi Greg_Deckler,
Wouldn't this be 36 instead of 24? If they started at 5:24 PM, they had 36 minutes in the 5 PM hour correct? Making the total 96 for 140 & 141 for the 5PM hour.
The 9:14 PM end time makes sense as they only had 14 minutes into the 9 PM hour.
- Greg_Deckler2 years ago
Community Champion
dcrow5378 Good catch. Easily fixed:
Hour Breakdown = VAR __currentHour = HOUR(MAX('Hours'[Hour])) VAR __startHour = HOUR(MIN('Data'[Start])) VAR __endHour = HOUR(MAX('Data'[End])) VAR __table = GENERATESERIES(__startHour,__endHour,1) VAR __table1 = ADDCOLUMNS(__table,"__minutes", SWITCH(TRUE(), __startHour < __endHour && [Value] <> __endHour && [Value] <> __startHour,60, __startHour < __endHour && [Value] = __endHour, MINUTE(MAX('Data'[End])), 60 - MINUTE(MAX(Data[Start])) ) ) VAR __table2 = FILTER(__table1,[__minutes]>0) RETURN SUMX(FILTER(__table2,[Value] = __currentHour),[__minutes])Will update.
- dcrow53782 years ago
Resolver I
Greg_Deckler
Thanks! This is super helpful by the way! - dcrow53782 years ago
Resolver I
Hey Greg,
Thanks Again for this. One more thing I was hoping you could help out with.
I am getting a full hour for an end time that is only 4 minutes into the end hour (or 0.07 of an hour)
Here are the punch times:Here is the output I am receiving:
Any idea why I am getting a full hour for the 2:00 PM hour?
I am hoping to get the following for that row:
FYI, the formula for the Hour Total Column is just
Hour Total =[Hour Breakdown Total]/60- dcrow53782 years ago
Resolver I
I think I figured it out. Just need a third switch?
Hour Breakdown = VAR __currentHour = HOUR(MAX('Hours'[Hour])) VAR __startHour = HOUR(MIN(vTimecardTransaction[starttime])) VAR __endHour = HOUR(MAX(vTimecardTransaction[endtime])) VAR __table = GENERATESERIES(__startHour,__endHour,1) VAR __table1 = ADDCOLUMNS(__table,"__minutes", SWITCH(TRUE(), __startHour < __endHour && [Value] <> __endHour && [Value] <> __startHour,60, __startHour < __endHour && [Value] = __endHour,MINUTE(MAX(vTimecardTransaction[endtime])), __startHour = __endHour && [Value] = __endHour,MINUTE(MAX(vTimecardTransaction[endtime])), 60 - MINUTE(MAX(vTimecardTransaction[starttime])) ) ) VAR __table2 = FILTER(__table1,[__minutes]>0) RETURN SUMX(FILTER(__table2,[Value] = __currentHour),[__minutes])
- dcrow53782 years ago
Resolver I
Hey Greg,
One more question...hopefully.
I am not able to figure out what to do when the End Hour is less than the Start Hour. The entry below is not populating any time.
For Instance:StartDateTime EndDateTime 4/29/2024 10:00:00 PM 4/30/2024 12:00:00 AM Hour Breakdown = VAR __currentHour = HOUR(MAX('Hours'[Hour])) VAR __startHour = HOUR(MIN(vTimecardTransaction[starttime])) VAR __endHour = HOUR(MAX(vTimecardTransaction[endtime])) VAR __table = GENERATESERIES(__startHour,__endHour,1) VAR __table1 = ADDCOLUMNS(__table,"__minutes", SWITCH(TRUE(), __startHour < __endHour && [Value] <> __endHour && [Value] <> __startHour,60, __startHour < __endHour && [Value] = __endHour,MINUTE(MAX(vTimecardTransaction[endtime])), __startHour = __endHour && [Value] = __endHour,MINUTE(MAX(vTimecardTransaction[endtime])), 60 - MINUTE(MAX(vTimecardTransaction[starttime])) ) ) VAR __table2 = FILTER(__table1,[__minutes]>0) RETURN SUMX(FILTER(__table2,[Value] = __currentHour),[__minutes])- dcrow53782 years ago
Resolver I
Solved and working great!
Hour Breakdown = VAR __currentHour = HOUR(MAX('Hours'[Hour])) VAR __startDatetime = MIN(vTimecardTransaction[starttime]) VAR __endDatetime = MAX(vTimecardTransaction[endtime]) VAR __startHour = HOUR(__startDatetime) VAR __endHour = HOUR(__endDatetime) -- Handle cases where end time crosses over midnight VAR __isCrossingMidnight = IF(__startDatetime > __endDatetime, 1, 0) VAR __adjustedEndHour = __endHour + 24 * __isCrossingMidnight -- Generate a series of hours, considering crossing over midnight VAR __table = GENERATESERIES(__startHour, __adjustedEndHour, 1) VAR __table1 = ADDCOLUMNS( __table, "__minutes", SWITCH( TRUE(), [Value] = __startHour && [Value] = __endHour + 24 * __isCrossingMidnight, DATEDIFF(__startDatetime, __endDatetime, MINUTE), [Value] = __startHour, 60 - MINUTE(__startDatetime), [Value] = __endHour + 24 * __isCrossingMidnight, MINUTE(__endDatetime), [Value] > __startHour && [Value] < __endHour + 24 * __isCrossingMidnight, 60, 0 ) ) VAR __table2 = FILTER(__table1, [__minutes] > 0) RETURN SUMX(FILTER(__table2, [Value] = __currentHour || [Value] = __currentHour + 24 * __isCrossingMidnight), [__minutes])