Loading

Calcular horas laborables entre dos marcas de tiempo

Fecha de publicación: Jun 6, 2023
Tarea
Cómo calcular el número de horas laborables que hay entre dos marcas de tiempo, por ejemplo, para calcular el tiempo transcurrido en algo desde una marca de tiempo de envío ([Nuevo]) hasta que se completó ([Procesado]). 
 
Pasos
En esta solución se presupone que existen marcas de tiempo para el inicio y el final de una acción determinada, denominadas aquí [Comienzo de la acción] y [Final de la acción]. Los siguientes pasos se muestran en el libro de trabajo adjunto.

Paso 1:

Cree parámetros para marcar el inicio y el final de las horas laborables. Así podrá ajustar las horas laborables como desee. 
  1. Haga clic con el botón derecho en el panel Datos y seleccione Crear parámetro
  2. Asigne el nombre Hora de apertura del día al parámetro, escriba los valores siguientes y luego haga clic en Aceptar
    • Tipo de datos: entero
    • Valores permitidos: intervalo
    • Mínimo:
    • Máximo: 12 
    • Tamaño del paso:
  3. Haga clic con el botón derecho en el panel Datos y seleccione Crear parámetro.
  4. Asigne el nombre Minuto de apertura del día al parámetro, escriba los valores siguientes y luego haga clic en Aceptar
    • Tipo de datos: cadena
    • Valores permitidos: lista
    • Lista de valores: "00", "15", "30" y "45" 
  5. Repita los dos pasos anteriores para Hora de cierre del día y Minuto de cierre del día
Nota: los pasos anteriores se basan en el formato de 12 horas y el intervalo de las horas de inicio y final es de 15 minutos. Si su programa lo requiere, puede hacer ajustes (formato de 24 horas en lugar de 12, cada 10 minutos en lugar de cada 15, etc.). 

Paso 2:

Cree cálculos para redondear al siguiente día laborable. 
  1. Seleccione Análisis > Crear campo calculado.
  2. Asigne al campo el nombre "Inicio de la acción: redondeado", escriba el cálculo siguiente y luego haga clic en Aceptar
     
    IF (DATEPART('hour', [Action Start]) * 60) + DATEPART('minute', [Action Start])  > (60 * (12 + [Day Close Hour]) ) + INT([Day Close Minute])
    THEN
    // created after End of Day so round to start of next business day
    DATEADD('minute', (60 * (24 + [Day Open Hour])) + INT([Day Open Minute]), DATETRUNC('day',[Action Start])) 
    ELSEIF
    (DATEPART('hour', [Action Start]) * 60) + DATEPART('minute', [Action Start])  < (60 * [Day Open Hour]) + INT([Day Open Minute])
    THEN
    // created before Start of Day so round to start of business day
    DATEADD('minute', (60 * [Day Open Hour]) + INT([Day Open Minute]), DATETRUNC('day',[Action Start])) 
    ELSE
    [Action Start]
    END
  3. Seleccione Análisis > Crear campo calculado, asigne al campo el nombre "Inicio de la acción: redondear a día laborable" y escriba el cálculo siguiente para comprobar si las nuevas marcas de tiempo redondeadas caen en fin de semana:
    IF DATENAME('weekday',[Action Start : Rounded]) = "Saturday" 
    THEN 
    // move to start of day monday by adding two days (48 hrs) and the monday morning hours
    DATEADD('minute', (60 * (48 + [Day Open Hour])) + INT([Day Open Minute]), DATETRUNC('day', [Action Start : Rounded]))
    ELSEIF DATENAME('weekday',[Action Start : Rounded]) = "Sunday" 
    THEN
    // move to start of day monday by adding a day (24 hrs) and the monday morning hours
    DATEADD('minute', (60 * (24 + [Day Open Hour])) + INT([Day Open Minute]), DATETRUNC('day', [Action Start : Rounded]))
    ELSE 
    [Action Start : Rounded]
    END
  4. Repita los dos cálculos anteriores para [Final de la acción].

Paso 3: 

Cree cálculos para buscar la diferencia horaria. 
  1. Cree el cálculo siguiente y póngale el nombre "Inicio: tiempo hasta final del día".
    DATEDIFF(  'minute',
        [Action Start: Round to Weekdays], 
        DATEADD('minute', (60 * (12 + [Day Close Hour])) + INT([Day Close Minute]), DATETRUNC('day',[Action Start: Round to Weekdays]))
    )
  2. Repita el cálculo anterior con Hora y Minuto de apertura de día, y póngale el nombre "Final: tiempo desde inicio del día".
  3. Cree tres cálculos DATEDIFF para calcular el resultado final de los minutos, los días y las semanas:
    "DateDiff días"
    DATEDIFF('day', [Action Start: Round to Weekdays], [Action End : Round to Weekdays])
    "DateDiff minutos"
    DATEDIFF('minute', [Action Start: Round to Weekdays], [Action End : Round to Weekdays])
    "DateDiff semanas"
    DATEDIFF('week', [Action Start: Round to Weekdays], [Action End : Round to Weekdays])
  4. Cree un cálculo para registrar el número de minutos por día laboral y llámelo "minutos por día laboral"
    (60 * (12 + [Day Close Hour (pm)] - [Day Open Hour (am)]) + INT([Day Close Minute (pm)]) - 
    INT([Day Open Minute (am)]))
  5. Cree un cálculo final para juntar todas las partes:
     
    IF DATETRUNC('day', [Action Start: Round to Weekdays]) = DATETRUNC('day', [Action End : Round to Weekdays])
    THEN
    // the same day so just return the minutes between the two times on the same day
    [DateDiff minutes]
    ELSEIF DATETRUNC('week', [Action Start: Round to Weekdays]) = DATETRUNC('week', [Action End : Round to Weekdays])
    THEN
    // the two days are in the same week, so add the time on the created day, the time on the end day, plus a full day for each day between
    (([DateDiff days] - 1) * [Minutes per workday] ) + [Start: Time to end of day] + [End : Time from start of day ]
    ELSE
    // the days are in two different weeks, so get the same calc as above, and subtract the weekends between
    // weekends between would be datediff weeks * 2 * work minutes per day
    (([DateDiff days] - 1 - ([DateDiff weeks] * 2)) * [Minutes per workday] ) + [Start: Time to end of day] + [End: Time from start of day ]
    END
Recursos adicionales
En resumen, los pasos descritos redondean todas las marcas de tiempo de modo que, si quedan fuera de las horas laborables habituales, se redondean al comienzo del siguiente día laborable.

Comente sobre este artículo... Foro de comentarios
Número del artículo de conocimiento

001456485

Archivos adjuntos

DATEDIFF weekends & business hours.twbx

176 KB

 
Cargando
Salesforce Help | Article