tengo una tabla en postgres con 2 columnas; order_timestamp, semana_horas.
Quiero crear una tercera columna 'due_timestamp' que se calcula usando 'ordered_timestamp' más 'weekday_hours' ... PERO excluyendo las horas que caen durante el fin de semana (12:00 a.m. sábado a 12:00 a.m. lunes)
ordered_timestamp | weekday_hours | due_timestamp 2020-06-04 16:00:00 | 12 | 2020-06-05 04:00:00 2020-06-05 16:00:00 | 48 | 2020-06-09 16:00:00 Sin la advertencia de excluir las horas de fin de semana, podría usar ordered_timestamp + interval '1 hour' * weekday_hours
weekday_hours puede variar de 1 hora a cientos de horas en algunos casos.
Parece que esta situación necesita algo adicional para filtrar las horas de fin de semana.
Si sus intervalos de fechas pueden abarcar varios períodos, usaría un enfoque de fuerza bruta enumerando todos los intervalos de 1 hora que caen entre las marcas de tiempo con generate_series() y luego contando solo aquellos que pertenecen a días hábiles:
select t.ordered_timestamp, t.due_timestamp, x.weekday_hours from mytable t cross join lateral ( select count(*) filter(where extract(dow from ts) between 1 and 5) - 1 weekday_hours from generate_series(ordered_timestamp, due_timestamp, '1 hour'::interval) s(ts) ) xorden_marca de tiempo | debido_marca de tiempo | semana_horas :------------------ | :------------------ | ------------: 2020-06-04 16:00:00 | 2020-06-05 04:00:00 | 12 2020-06-05 16:00:00 | 2020-06-09 16:00:00 | 48
¿algo como esto?
case when (EXTRACT(DOW FROM ordered_timestamp ) = 6 ) then ordered_timestamp + interval '1 hour' * (weekday_hours+48) when (EXTRACT(DOW FROM ordered_timestamp ) = 0 ) then ordered_timestamp + interval '1 hour' * (weekday_hours+24) else ordered_timestamp + interval '1 hour' * weekday_hours end