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

We've captured the moments from FabCon & SQLCon that everyone is talking about, and we are bringing them to the community, live and on-demand. Starts on April 14th. Register now

Reply
Syndicate_Admin
Administrator
Administrator

¿Cómo podemos crear horas y días hábiles en el modo de consulta directa?

Queridos campeones:

He estado tratando de crear un horario y días de trabajo comerciales en modo de consulta directa. Pero no puedo usar ciertas funciones como SUMX y LOOKUP Value. Es cualquier sintaxis alternativa que podamos usar. Esta es la siguiente medida que estoy utilizando.

Horas de trabajo entre fechas =
Var Fecha de inicio = DATEVALUE('Consulta de problema'[FechaCreatedel])
Var StartTime = DATEVALUE('Consulta de problema'[FechaCreatedel])- Fecha de inicio
Var endDate = DATEVALUE('Consulta de problema'[FechaCerradaEn])
Var endTime = DATEVALUE('Consulta de problema'[FechaCerradaEn]) - endDate

Var firstFullDay = Fecha de inicio + 1
Var lastFullDay = endDate - 1

Var inBetweenWorkingHours =
SI(
firstFullDay > lastFullDay,
0,
SUMX(CALENDARIO(firstFullDay, lastFullDay), LOOKUPVALUE(WorkingHoursTable (Tabla de horas de trabajo)[IsWorkingDay], WorkingHoursTable (Tabla de horas de trabajo)[Día de la semana], DÍA LABORABLE([Fecha], 2)))
)

Var firstDayStart = LOOKUPVALUE(WorkingHoursTable (Tabla de horas de trabajo)[Hora de inicio], WorkingHoursTable (Tabla de horas de trabajo)[Día de la semana], DÍA LABORABLE(Fecha de inicio, 2))
Var firstDayEnd = LOOKUPVALUE(WorkingHoursTable (Tabla de horas de trabajo)[Fin de la hora], WorkingHoursTable (Tabla de horas de trabajo)[Día de la semana], DÍA LABORABLE(Fecha de inicio, 2))

Var lastDayStart = LOOKUPVALUE(WorkingHoursTable (Tabla de horas de trabajo)[Hora de inicio], WorkingHoursTable (Tabla de horas de trabajo)[Día de la semana], DÍA LABORABLE(endDate, 2))
Var lastDayEnd = LOOKUPVALUE(WorkingHoursTable (Tabla de horas de trabajo)[Fin de la hora], WorkingHoursTable (Tabla de horas de trabajo)[Día de la semana], DÍA LABORABLE(endDate, 2))

Var effectiveStartTime = SI(StartTime < firstDayStart, firstDayStart, StartTime)
Var effectiveEndTime = SI(endTime > lastDayEnd, lastDayEnd, endTime)
devolución
SI(
Fecha de inicio = endDate,
24 * SI(effectiveEndTime > effectiveStartTime, effectiveEndTime - effectiveStartTime, 0),
Var firstDayWorkingHour =
24 *
SI(
StartTime > firstDayEnd,
0,
firstDayEnd - effectiveStartTime
)

Var lastDayWorkingHour =
24 *
SI(
endTime < lastDayStart,
0,
effectiveEndTime - lastDayStart
)
devolución firstDayWorkingHour + lastDayWorkingHour + inBetweenWorkingHours
)

Gracias de antemano.

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

@Rockz , Intente usar belowmeasure

Horas de trabajo entre fechas =
VAR startDate = DATEVALUE('Issue Query'[DateCreatedon])
VAR startTime = TIMEVALUE('Consulta de problema'[DateCreatedon])
VAR endDate = DATEVALUE('Issue Query'[DateClosedOn])
VAR endTime = TIMEVALUE('Consulta de problema'[DateClosedOn])

VAR firstFullDay = FechaDeinicio + 1
VAR lastFullDay = endDate - 1

VAR inBetweenWorkingHours =
SI(
firstFullDay > lastFullDay,
0,
CALCULAR(
SUM(WorkingHoursTable[WorkingHours]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[Date] >= firstFullDay &&
WorkingHoursTable[Date] <= lastFullDay &&
WorkingHoursTable[IsWorkingDay] = TRUE()
)
)
)

VAR firstDayStart = CALCULAR(
MAX(WorkingHoursTable[StartTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[WeekDay] = WEEKDAY(startDate, 2)
)
)
VAR firstDayEnd = CALCULAR(
MAX(WorkingHoursTable[EndTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[WeekDay] = WEEKDAY(startDate, 2)
)
)

VAR lastDayStart = CALCULAR(
MAX(WorkingHoursTable[StartTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[WeekDay] = WEEKDAY(endDate, 2)
)
)
VAR lastDayEnd = CALCULAR(
MAX(WorkingHoursTable[EndTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[WeekDay] = WEEKDAY(endDate, 2)
)
)

VAR effectiveStartTime = IF(startTime < firstDayStart, firstDayStart, startTime)
VAR effectiveEndTime = IF(endTime > lastDayEnd, lastDayEnd, endTime)

DEVOLUCIÓN
SI(
FechaInicio= FechaFinal,
24 * IF(effectiveEndTime > effectiveStartTime, effectiveEndTime - effectiveStartTime, 0),
VAR primerDíaHoraLaboral =
24 *
SI(
startTime > firstDayEnd,
0,
firstDayEnd - effectiveStartTime
)

VAR últimaHoraTrabajadora =
24 *
SI(
endTime < lastDayStart,
0,
effectiveEndTime - lastDayStart
)

RETURN firstDayWorkingHour + lastDayWorkingHour + inBetweenWorkingHours
)

Caro

Gracias por su rápida respuesta.

Pero mientras uso esto, recibo este error

Las operaciones de comparación de DAX no admiten la comparación de valores de tipo True/False con valores de tipo Integer. Considere la posibilidad de utilizar la función VALUE o FORMAT para convertir uno de los valores.

y necesito usar la condición de verdadero / falso para la tabla de horas de trabajo.

Esta es la medida que estoy utilizando para la tabla de horas de trabajo.

HorasTrabajoTabla =
ADDCOLUMNS (
CALENDARIO (FECHA(2020, 1, 1), FECHA(2030, 12, 31)),
"IsWorkingDay", SI (DÍA LABORABLE([Fecha], 2) < 6, 1,0)
)

Gracias.

Hola @Rockz ,

Me gustaría agradecer el valioso aporte proporcionado por el @bhanu_gautam . Sus ideas iniciales fueron fundamentales para guiar mi enfoque. Sin embargo, me di cuenta de que se necesitaban más detalles para comprender completamente el problema.

El problema puede estar aquí, su campo [IsWorkingDay] es 1 o 0.

VAR inBetweenWorkingHours =
    IF (
        firstFullDay > lastFullDay,
        0,
        CALCULATE (
            SUM ( WorkingHoursTable[WorkingHours] ),
            FILTER (
                WorkingHoursTable,
                WorkingHoursTable[Date] >= firstFullDay
                    && WorkingHoursTable[Date] <= lastFullDay
                    && WorkingHoursTable[IsWorkingDay] = TRUE ()
            )
        )
    )


Así que puedes intentar cambiar aquí a esto.

VAR inBetweenWorkingHours =
    IF (
        firstFullDay > lastFullDay,
        0,
        CALCULATE (
            SUM ( WorkingHoursTable[WorkingHours] ),
            FILTER (
                WorkingHoursTable,
                WorkingHoursTable[Date] >= firstFullDay
                    && WorkingHoursTable[Date] <= lastFullDay
                    && WorkingHoursTable[IsWorkingDay] = 1
            )
        )
    )

Si su período actual no se refiere a esto, aclare en una respuesta de seguimiento.

Saludos

Clara Gong

Si esta publicación ayuda, considere Acéptalo como la solución para ayudar a los demás miembros a encontrarlo más rápidamente.

Caro

¡Recibo este error de nuevo!

La función 'CALCULATE' no está permitida como parte de las expresiones DAX de columna calculadas en los modelos de DirectQuery.

Horas de trabajo entre fechas =
VAR FechaDeinicio = DATEVALUE('Consulta de problema'[DateCreatedon])
VAR Tiempo de inicio = VALOR DE TIEMPO('Consulta de problema'[DateCreatedon])
VAR FechaFin = DATEVALUE('Consulta de problema'[DateClosedOn])
VAR HoraFin = VALOR DE TIEMPO('Consulta de problema'[DateClosedOn])
VAR firstFullDay = fechaFecha de inicio + 1
VAR lastFullDay = fecha de finalización - 1
VAR inBetweenWorkingHours =
SI (
firstFullDay > lastFullDay,
0,
CALCULAR (
SUMA (WorkingHoursTable[WorkingHours]),
FILTRO (
Tabla de horas de trabajo,
WorkingHoursTable[Date] >= firstFullDay &&
WorkingHoursTable[Date] <= lastFullDay &&
WorkingHoursTable[IsWorkingDay] = 1
)
)
)
VAR firstDayStart = CALCULAR(
MÁXIMO(WorkingHoursTable[WorkstartTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[IsWorkingDay] = DÍA LABORABLE(Fecha de inicio, 2)
)
)
VAR firstDayEnd = CALCULAR(
MÁXIMO(WorkingHoursTable[WorkEndTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[IsWorkingDay] = DÍA LABORABLE(Fecha de inicio, 2)
)
)
VAR lastDayStart = CALCULAR(
MÁXIMO(WorkingHoursTable[WorkstartTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[IsWorkingDay] = DÍA LABORABLE(endDate, 2)
)
)
VAR lastDayEnd = CALCULAR(
MÁXIMO(WorkingHoursTable[WorkEndTime]),
FILTRO(
Tabla de horas de trabajo,
WorkingHoursTable[IsWorkingDay] = DÍA LABORABLE(endDate, 2)
)
)
VAR effectiveStartTime = SI(startTime < firstDayStart, firstDayStart, startTime)
VAR effectiveEndTime = SI(endTime > lastDayEnd, lastDayEnd, endTime)
DEVOLUCIÓN
SI(
FechaInicio= FechaFinal,
24 * SI(effectiveEndTime > effectiveStartTime, effectiveEndTime - effectiveStartTime, 0),
VAR primerHoraDíaLaborable =
24 *
SI(
startTime > firstDayEnd,
0,
firstDayEnd - effectiveStartTime
)
VAR lastDayWorkingHour =
24 *
SI(
endTime < lastDayStart,
0,
effectiveEndTime - lastDayStart
)
DEVOLUCIÓN firstDayWorkingHour + lastDayWorkingHour + inBetweenWorkingHours
)
¡Gracias de antemano!.

Hola @Rockz ,

Intente usar la expresión como MEASURE en lugar de una columna calculada.

Saludos

Clara Gong

Si esta publicación ayuda, considere Acéptalo como la solución para ayudar a los demás miembros a encontrarlo más rápidamente.

Helpful resources

Announcements
New to Fabric survey Carousel

New to Fabric Survey

If you have recently started exploring Fabric, we'd love to hear how it's going. Your feedback can help with product improvements.

Power BI DataViz World Championships carousel

Power BI DataViz World Championships - June 2026

A new Power BI DataViz World Championship is coming this June! Don't miss out on submitting your entry.

Join our Fabric User Panel

Join our Fabric User Panel

Share feedback directly with Fabric product managers, participate in targeted research studies and influence the Fabric roadmap.

March Power BI Update Carousel

Power BI Community Update - March 2026

Check out the March 2026 Power BI update to learn about new features.

Top Kudoed Authors