Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
michael_laan
Frequent Visitor

Cálculo de horas de trabajo entre fechas de horario comercial excluyendo fines de semana

He estado tratando de hacer un cálculo de las horas de trabajo entre dos fechas, exlcuding fines de semana y horas no laborables. Además, el cálculo necesario para ajustar la fecha/hora de inicio y detención real si se crearon o modificaron fuera del horario comercial normal.

Me inspiro en este hilo(https://community.powerbi.com/t5/Desktop/Calculate-Date-and-Time-difference-considering-the-weekend...y ajustado para mis porpuses. Aparte de satisfacer mis necesidades exacly, lo que me gusta de mi adaptación es que utiliza variables en lugar de crear columnas adicionales que solo se utilizan para la salida final.

No soy un experto en DAX, más de un novato, pero esto funcionó bien para mí y quería ver si había improvisaciones que se podrían hacer a él o errores que podría estar faltando?

HoursToFile á // Obtener columna de fecha en el formato de 

solo fecha
VAR DocumentFirstDateOnly ? DATE(YEAR('DATA BDM History'[Document Created Date]),MONTH('DATA BDM History'[Document Created Date]),DAY('DATA BDM History'[Document Created Date])))
VAR DocumentLastDateOnly ? DATE(YEAR('DATA BDM History'[Document Modified Date]),MONTH('DATA BDM History'[Document Modified Date]),DAY('DATA BDM History'[Document Modified Date]))

// Set Work Hours for Created & Fechas modificadas
VAR DocumentFirstDateOnlyStart á DocumentFirstDateOnly + TIME(08,00,00)
VAR DocumentLastDateOnlyStart ? DocumentLastDateOnly + TIME(08,00,00)
VAR DocumentFirstDateOnlyEnd ? DocumentFirstDateOnly + TIME(17,00,00 )
VAR DocumentLastDateOnlyEnd á DocumentLastDateOnly + TIME(17,00,00)
VAR WorkHours á 9

// Set Next Business Day
// Nota: Usado si Se ha creado o modificado el programa
VAR DocumentCreatedNextBusiness - IF(WEEKDAY(DocumentFirstDateOnly, 1) + 1 - 1, DocumentFirstDateOnlyStart + 2, IF(WEEKDAY(DocumentFirstDateOnly, 1) + 1 - 7, DocumentFirstDateOnlyStart + 3, DocumentFirstDateOnlyStart + 1))
 
VAR DocumentModifiedNextBusiness ? IF(WEEKDAY(DocumentLastDateOnly, 1) + 1 - 1, DocumentLastDateOnlyStart + 2, IF(WEEKDAY(DocumentLastDateOnly, 1) + 1 - 7, DocumentLastDateOnlyStart + 3, DocumentLastDateOnlyStart + 1)) 
        
// Establecer fechas reales creadas o modificadas
// Nota: Comprobar si se ha creado & Modificado por lo tanto, utilizar el siguiente día hábil.
VAR DocumentDateCreated á IF('DATA BDM History'[Document Created Date] < DocumentFirstDateOnlyStart, DocumentFirstDateOnlyStart,IF('DATA BDM History'[Document Created Date] > DocumentFirstDateOnlyEnd, DocumentCreatedNextBusiness,'DATA BDM History'[Document Created Date]))
VAR DocumentDateModified ? IF('DATA BDM History] < DocumentLastDateOnlyStart, DocumentLastDateOnlyStart,IF('DATA BDM History' DocumentLastDateOnlyEnd, DocumentModifiedNextBusiness ,'DATA BDM History'[Document Modified Date]))

// Get Real First & Last Dates Only
// Note: Redo Created & Modified dates based on Real Created & Modified Date variables
VAR DocumentRealFirstDateOnly ? DATE(YEAR(DocumentDateCreated),MONTH(DocumentDateCreated),DAY(DocumentDateCreated))
VAR DocumentRealLastDateOnly DocumentDateModified)) // Establecer horas de trabajo reales para fechas

creadas y modificadas
VAR DocumentRealFirstDateOnlyStart á DocumentRealFirstDateOnly + TIME(08,00,00)
VAR DocumentRealLastDateOnlyStart ? DocumentRealLastDateOnly + TIME(08,0 0,00)
VAR DocumentRealFirstDateOnlyEnd á DocumentRealFirstDateOnly + TIME(17,00,00)
VAR DocumentRealLastDateOnlyEnd ? DocumentRealLastDateOnly + TIME(17,00,00)

// Fecha & Diferencia de tiempo entre Real Created & Modified
VAR DateDiff - DATEDIFF(DocumentDateCreated,DocumentDateModified,DAY)

// Excluir fines de semana de DateDiff
VAR FullDaysToFile á IF(DateDiff > 1,CALCULATE(DISTINCTCOUNT('DateKey'[Date]),FILTER('DateKey','DateKey'[Date] > DocumentDateCreated && 'DateKey'[Date] < DocumentDateModified && 'DateKey'[IsWorkDay] ? 1 )) -1, 0)

// Time to File Variables
VAR FirstDaySeconds ? IF(DateDiff ? 0, DATEDIFF(DocumentDateCreated,DocumentDateModified, SECOND), DATEDIFF(DocumentDateCreated,DocumentRealFirstDateOnlyEnd,SECOND))
VAR LastDaySeconds ? IF(DateDiff > ? 1, DATEDIFF(DocumentRealLastDateOnlyStart,DocumentDateModified,SECOND), 0)
VAR MiddleDaysSeconds ? FullDaysToFile * WorkHours * 3600

// Add up First, Middle & Last Day seconds
VAR TotalSecondsToFile ? FirstDaySeconds + LastDaySeconds + MiddleDaysSeconds RETURN

// Return hours to file
ROUND(TotalSecondsToFile / 3600, 1)

Validación */ "Fecha de creación del
documento: " & "Historial de BDM de datos" [Fecha de creación del documento] & UNICHAR(10) &
"DocumentDateCreated : " & DocumentDateCreated & UNICHAR(10) & &
"Document Modified Date: " & 'DATA BDM History'[Document Modified Date] & UNICHAR(10) &
"DocumentDateModified : " & DocumentDateModified & UNICHAR(10) & UNICHAR(10) &
"DateDiff: " & DateDiff & DateDiff & UNICHAR(10) &
"FullDaysToFile. FullDaysToFile & UNICHAR(10) &
"FirstDaySeconds: " & FirstDaySeconds & UNICHAR(10) &
"LastDaySeconds: " & & LastDaySeconds & UNICHAR(10) &
"MiddleDaysSeconds: " & MiddleDaysSeconds & UNICHAR(10) &
"TotalSecondsToFile: " & TotalSecondsToFile  & UNICHAR(10) & UNICHAR(10) &
"Hours Total To File: " & ROUND(TotalSecondsToFile / 3600,1)
*/ */

1 ACCEPTED SOLUTION
Greg_Deckler
Super User
Super User

¿Así que así? https://community.powerbi.com/t5/Quick-Measures-Gallery/Net-Work-Duration/m-p/481543#M182

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

View solution in original post

4 REPLIES 4
STIMIL
Frequent Visitor

Hola Michael,

En el código, las variables siguientes se inicializaron pero nunca se usaron, ¿no es necesario utilizar? Veo que para algunas fechas estoy recibiendo valores -ve. Tal como, 4/17/2020 11:59:27 PM -> 4/18/2020 12:01:14 AM para la hora de inicio y finalización como 8am a 5pm.

Establecer horas de trabajo para fechas creadas y modificadas
VAR DocumentFirstDateOnlyStart á DocumentFirstDateOnly + TIME(08,00,00)

VAR DocumentLastDateOnlyEnd á DocumentLastDateOnly + TIME(17,00,00)

Gracias, Stimil

Hola @STIMIL ,

Creo que agregué las variables para las pruebas y nunca las quité. Recomiendo encarecidamente mirar la solución aceptada para mi post, aunque, el código de @Greg_Deckler fue mucho más limpio y proporcionó los mismos resultados.

Greg_Deckler
Super User
Super User

¿Así que así? https://community.powerbi.com/t5/Quick-Measures-Gallery/Net-Work-Duration/m-p/481543#M182

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

¡Gracias, Greg!

Usé esta edición de su post y funcionó perfectamente! Tuve que hacer una edición:

Cambiado:

Obtener las fechas de inicio y finalización
VAR __dateStart - MAX([Date_Start])
VAR __dateEnd - MAX([Date_End])

Para:

Obtener las fechas de inicio y finalización

VAR __dateEnd [Date_End]

Gracias de nuevo, mucho más limpio que mi trabajo 😉

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.