Agregar minutos a DateTime (pero solo durante las horas de trabajo)

Un usuario Pregunto ✅

Anónimo

Todo,

Recibo el siguiente error:

«Consulta (21, 20) La variable de tabla ‘TopValues’ no se puede utilizar en el contexto actual porque se espera una tabla base.«

al ejecutar la siguiente expresión:

// This expression adds minutes to a datetime, but only distributes them over specified work days (mon-fri) and work hours (9-5).

EVALUATE

VAR startDatetime = DATE ( 2018, 12, 28 ) + TIME ( 16, 0, 0 )
    
VAR MinutesToAdd = 720

VAR Range = GENERATESERIES ( startDatetime, startDatetime + 90, TIME ( 0, 1, 0 ) ) // the 90 days is an abritary number.
    
VAR FilteredRange =
    FILTER (
        Range,
        NOT WEEKDAY ( [Value] ) IN { 1, 7 } // Include only weekdays
            && HOUR ( [Value] ) >= 9 && HOUR ( [Value] ) < 17 // 9 AM to 5 PM
            && NOT ( MONTH ( [Value] ) = 12 && DAY ( [Value] ) = 25 ) // Exclude Christmas
    )
    
VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC )
    
VAR Result = MAX ( TopValues[Value] )

RETURN
    Result

¿Alguna idea sobre una solución?

Anónimo

Arreglado. Por alguna razón, cambiar MAX a MAXX funciona:

EVALUATE
{
VAR startDatetime = DATE ( 2018, 12, 28 ) + TIME ( 16, 0, 0 )
    
VAR MinutesToAdd = 720

VAR Range = GENERATESERIES ( startDatetime, startDatetime + 90, TIME ( 0, 1, 0 ) ) // the 90 days is an abritary number.
    
VAR FilteredRange =
    FILTER (
        Range,
        NOT WEEKDAY ( [Value] ) IN { 1, 7 } // Include only weekdays
            && HOUR ( [Value] ) >= 9 && HOUR ( [Value] ) < 17 // 9 AM to 5 PM
            && NOT ( MONTH ( [Value] ) = 12 && DAY ( [Value] ) = 25 ) // Exclude Christmas
    )
    
VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC )
    
VAR Result = MAXX ( TopValues, [Value] ) // Must be changed to MAXX

RETURN
    Result
    }

Anónimo

Arreglado. Por alguna razón, cambiar MAX a MAXX funciona:

EVALUATE
{
VAR startDatetime = DATE ( 2018, 12, 28 ) + TIME ( 16, 0, 0 )
    
VAR MinutesToAdd = 720

VAR Range = GENERATESERIES ( startDatetime, startDatetime + 90, TIME ( 0, 1, 0 ) ) // the 90 days is an abritary number.
    
VAR FilteredRange =
    FILTER (
        Range,
        NOT WEEKDAY ( [Value] ) IN { 1, 7 } // Include only weekdays
            && HOUR ( [Value] ) >= 9 && HOUR ( [Value] ) < 17 // 9 AM to 5 PM
            && NOT ( MONTH ( [Value] ) = 12 && DAY ( [Value] ) = 25 ) // Exclude Christmas
    )
    
VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC )
    
VAR Result = MAXX ( TopValues, [Value] ) // Must be changed to MAXX

RETURN
    Result
    }

Greg_Deckler

Correcto, TOPN requiere una tabla, no una tabla o expresión de tabla.

https://docs.microsoft.com/en-us/dax/topn-function-dax

No estoy completamente seguro de entender su necesidad de eso, ya que en la siguiente línea simplemente toma el MAX. ¿Solo toma el MAX de tu FilteredRange?

Anónimo

En respuesta a Greg_Deckler

El TOPN (junto con MAX ()) es necesario para que funcione la lógica de negocios descrita (es decir, agregar tiempo a una fecha y hora, pero solo para que se aplique a los días y horas de trabajo). Como alternativa a TOPN y MAX (), es posible que haya agregado un índice y luego aplicado FILTER () para regresar [value] donde [index] = MinutesToAdd, pero TOPN es una solución elegante con un plan de consulta optimizado.

De todos modos, este punto es discutible porque TOPN no es el problema. Puede confirmar esto en DAX Studio evaluando esa variable, es decir, esto funciona:

VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC ) 
//VAR Result = MAX ( TopValues[Value] )
RETURN
TopValues

Deja un comentario

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