Calcule el tiempo en días, horas y minutos

Un usuario Pregunto ✅

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"

3.PNG

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.Untitled.png

¿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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *