SR1
Hola a todos,
Tengo que calcular la diferencia entre dos fechas y mostrar el resultado en formato de días, horas y minutos. Si la diferencia es> 24 horas, el resultado deberían estar en días, horas y minutos. Si es <24 horas, el resultado debe ser en horas y minutos. Y también el resultado debe estar en formato ordenable (asc / desc según la diferencia).
Aquí están los datos de muestra.
En fecha |
OutDate |
Resultado |
27/10/2017 6:30:49 a.m. |
31/10/2017 9:16:23 a.m. |
4 días 2 horas 45 minutos |
19/01/2018 10:33:27 p.m. |
23/01/2018 2:08:58 p.m. |
3 días 15 horas 35 minutos |
23/01/2018 9:07:03 p.m. |
24/01/2018 8:36:57 p.m. |
23 horas 29 minutos |
29/11/2017 11:05:40 a.m. |
29/11/2017 8:11:01 p.m. |
09 horas 05 minutos |
12/03/2017 12:37:04 p.m. |
12/03/2017 12:59:46 p.m. |
00h 22min |
Soy nuevo en dax y PowerBI. Ayúdame con la fórmula dax.
Gracias,
SR1
danextian
En respuesta a SR1
Hola @ SR1,
Incluya información como esta sobre sus datos en el futuro.
Aquí está el código modificado. Observe las cuerdas en rojo.
Time = //CALCULATIONS VAR DIFF = InOut[OutDate] - InOut[InDate] VAR NumOfMinutes = DIFF * 24 * 60 VAR DAYS = IF ( DIFF >= 1, INT ( DIFF ), BLANK () ) VAR HOURS = INT ( ( DIFF - DAYS ) * 24 ) VAR MINUTES = NumOfMinutes - ( DAYS * 24 * 60 ) - ( HOURS * 60 ) //TEXTS VAR DaysText = IF ( DAYS > 1, FORMAT ( DAYS, "00" ) & "days" ) VAR HoursText = FORMAT ( HOURS, "00" ) & "hrs" VAR MinutesText = FORMAT ( MINUTES, "00" ) & "mins" RETURN IF ( NOT ( ISBLANK ( InOut[InDate] ) ), COMBINEVALUES ( " ", DaysText, HoursText, MinutesText ) )
ChrisMendoza
hola @ SR1,
Otra posible opción que podría considerar usando el Editor de consultas.
let Source = Excel.Workbook(File.Contents("C:UsersxxxxDesktopBook1.xlsx"), null, true), Table2_Table = Source{[Item="Table2",Kind="Table"]}[Data], #"Changed Type" = Table.TransformColumnTypes(Table2_Table,{{"InDate", type datetime}, {"OutDate", type datetime}}), #"Added Custom" = Table.AddColumn(#"Changed Type", "Duration", each [OutDate]-[InDate]), #"Added Custom1" = Table.AddColumn(#"Added Custom", "Duration Expanded", each Duration.ToRecord([Duration])), #"Expanded Duration Expanded" = Table.ExpandRecordColumn(#"Added Custom1", "Duration Expanded", {"Days", "Hours", "Minutes", "Seconds"}, {"Days", "Hours", "Minutes", "Seconds"}), #"Added Custom2" = Table.AddColumn(#"Expanded Duration Expanded", "Result", each Number.ToText([Days])&"days"&" "&Number.ToText([Hours])&"hrs"&" "&Number.ToText([Minutes])&"min"&" "&Number.ToText([Seconds])&"secs"), #"Added Custom3" = Table.AddColumn(#"Added Custom2", "Result #2", each Text.Combine({Number.ToText([Days]),"days",Number.ToText([Hours]),"hrs",Number.ToText([Minutes]),"mins",Number.ToText([Seconds]),"secs"}," ")) in #"Added Custom3"
SR1
En respuesta a ChrisMendoza
¡Gracias @ChrisMendoza! Se me pidió que mostrara el resultado en ‘días’ solo si la diferencia es mayor a 24 horas.
danextian
Hola @ SR1,
Pruebe esto como una columna calculada:
Time = //----CALCULATIONS VAR DIFF = InOut[OutDate] - InOut[InDate] VAR NumOfMinutes = DIFF * 24 * 60 VAR DAYS = IF ( DIFF >= 1, INT ( DIFF ), BLANK () ) VAR HOURS = INT ( ( DIFF - DAYS ) * 24 ) VAR MINUTES = NumOfMinutes - ( DAYS * 24 * 60 ) - ( HOURS * 60 )
//---TEXTS VAR DaysText = IF ( DAYS >= 1, FORMAT ( DAYS, "00" ) & "days" ) VAR HoursText = FORMAT ( HOURS, "00" ) & "hrs" VAR MinutesText = FORMAT ( MINUTES, "00" ) & "mins"
RETURN COMBINEVALUES ( " ", DaysText, HoursText, MinutesText )
SR1
En respuesta a danextian
¡Gracias @danextian! Pero da valores negativos cuando la columna ‘OutDate’ es nula / vacía.
En fecha |
OutDate |
Hora |
22/01/2018 2:57:06 a.m. |
-1034931 horas 03 minutos |
|
13/02/2018 10:23:06 p.m. |
-1035479 horas 37 minutos |
danextian
En respuesta a SR1
Hola @ SR1,
Incluya información como esta sobre sus datos en el futuro.
Aquí está el código modificado. Observe las cuerdas en rojo.
Time = //CALCULATIONS VAR DIFF = InOut[OutDate] - InOut[InDate] VAR NumOfMinutes = DIFF * 24 * 60 VAR DAYS = IF ( DIFF >= 1, INT ( DIFF ), BLANK () ) VAR HOURS = INT ( ( DIFF - DAYS ) * 24 ) VAR MINUTES = NumOfMinutes - ( DAYS * 24 * 60 ) - ( HOURS * 60 ) //TEXTS VAR DaysText = IF ( DAYS > 1, FORMAT ( DAYS, "00" ) & "days" ) VAR HoursText = FORMAT ( HOURS, "00" ) & "hrs" VAR MinutesText = FORMAT ( MINUTES, "00" ) & "mins" RETURN IF ( NOT ( ISBLANK ( InOut[InDate] ) ), COMBINEVALUES ( " ", DaysText, HoursText, MinutesText ) )
Anónimo
En respuesta a danextian
Hola,
Intenté esto también, funcionó muy bien. ¿Puedo preguntarle cómo haría para modificar este código para mostrar dias laborables en lugar de dias? Es decir, de lunes a viernes. Si es posible agregar días festivos (como la fórmula NETWORKDAYS en Excel), sería aún mejor.
Gracias por adelantado.
SR1
En respuesta a danextian
¡Gracias @danextian! Muestra los valores esperados ahora. Pero la clasificación no funciona si los días son más de 99 😞 Modifiqué var DaysText = IF (DAYS> 2, FORMAT (DAYS, «000») & «days») y terminé con algo como esto.
¿Hay alguna manera de manejar la clasificación sin agregar ceros al frente?
danextian
En respuesta a SR1
Puede crear una columna calculada para ordenar el tiempo en texto. Algo como int ((out-in) * 24 * 60) para que no necesite agregar otro 0.
jthomson
Cuando he hecho cosas como esta antes, he buscado crear una columna que calcule la diferencia entre los tiempos de inicio y finalización en el período de tiempo más pequeño que le interesa (aquí serían minutos): usted Querrá que esto se ordene de todos modos, pero una vez que lo tenga, puede usar una combinación de dividir por 60, 1440, etc. junto con MOD y ROUNDDOWN para obtener la cantidad correcta de días, horas, etc. Obtenga esas cifras correctas y usted luego puede concatenarlos todos juntos (tal vez usando una función if para ignorar los días si hay cero) para obtener el resultado que busca