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.
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) */ */
Solved! Go to Solution.
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.
¡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 😉
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
1 | |
1 | |
1 | |
1 |
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |