Re: Restar solamente el tiempo solapado

From: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
To: mauricio pullabuestan <jmauriciopb(at)yahoo(dot)es>
Cc: Pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Restar solamente el tiempo solapado
Date: 2016-09-12 11:23:43
Message-ID: CANm+PCAxSVrieFCv3LW=wZR37Wbmjao3k+feZR-zZFz3rk2vLg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Podes reunirlos de esta manera:
select extract(epoch from o.fecha_final-fecha_inicial)/60, *
from
orden_registro o
inner join tiempo_para t on
o.empleado_id=t.empleado_id and
(
t.fecha_incial between o.fecha_inicial and o.fecha_final or
t.fecha_final between o.fecha_inicial and o.fecha_final
)

te dejo el cálculo de restar la segunda parte que lo podes hacer por
ejemplo con algunos case when

El 9 de septiembre de 2016, 19:46, mauricio pullabuestan <
jmauriciopb(at)yahoo(dot)es> escribió:

> Buen día
>
> Tengo la tabla orden_registro donde el empleado guarda la fecha hora
> inicial, fecha hora final que les toma realizar un proceso.
> En la tabla tiempo_para se registra la fecha hora inicial, fecha hora
> final del tiempo de para.
>
>
> Necesito hacer un Sql que me de los registros de la tabla orden_registro
> con 3 columnas adicionales
> 1.- tiempo total que toma realizar el proceso (tabla orden_registro
> fecha_final - fecha_inicial).
> 2.- tiempo de para (tabla tiempo_para) solamente el periodo de tiempo que
> se solapa.
> 3.- tiempo neto (tiempo total - tiempo de para).
>
> El tiempo de para puede afectar a uno o 2 registros de la tabla
> orden_registro.
>
> Ej.
> Tiempo de para afecta a un solo registro.
> El empleado X0012 registra
> Tabla orden_registo
> 2016-09-07 06:20 a 2016-09-07 06:40 en realizar el proceso 'O-15' tiempo
> total 20'
>
> En ese tiempo se registro
> Tabla tiempo_para2016-09-07 06:22 a 2016-09-07 06:25, 3' que afecta a un
> registro de la tabla orden_registro
>
>
> El resultado seria
> 2016-09-07 06:20:00 a 2016-09-07 06:40:00 en realizar el proceso 'O15'
> tiempo total 20' tiempo de para 3' tiempo total 17'
>
>
> Tiempo de para afecta a 2 registros
> Tabla orden_registo
> 2016-09-07 07:45:00 a 2016-09-07 08:10:00 en realizar el proceso 'O-10'
> tiempo total 25'
> 2016-09-07 08:10:00 a 2016-09-07 08:48:00 en realizar el proceso 'O-15'
> tiempo total 38'
>
> En ese tiempo se registro
> Tabla tiempo_para2016-09-07 08:03 a 2016-09-07 08:12, 9' de para, que
> afecta a los 2 registros
>
>
> El resultado seria
> 2016-09-07 07:45:00 a 2016-09-07 08:10:00 en realizar el proceso 'O-10'
> tiempo total 25' tiempo de para 7' tiempo neto 18'
> 2016-09-07 08:10:00 a 2016-09-07 08:48:00 en realizar el proceso 'O-15'
> tiempo total 38' tiempo de para 2' tiempo neto 36'
>
> Resultado esperado (disculpas si no es ligible el resultado esperado).
> Empleado Orden Proceso fecha Inicial Fecha final Total
> Para Neto
> X0012 8797911 O-15 2016-09-07 06:20 2016-09-07 06:40 00:20
> 00:03 00:17
> X0012 8788288 O-15 2016-09-07 07:10 2016-09-07 07:30 00:20
> 00:00 00:20
> X0012 8783454 O-15 2016-09-07 07:30 2016-09-07 07:45 00:15
> 00:00 00:15
> X0012 AI-8 O-10 2016-09-07 07:45 2016-09-07 08:10 00:25
> 00:07 00:18
> X0012 8796366 O-15 2016-09-07 08:10 2016-09-07 08:48 00:38
> 00:02 00:36
>
>
> Hice algunos intentos utilizando generate series y
>
> Select *
>
> From t
> except
> select *
>
> Pero resulta algo engorroso.
>
> Existe alguna manera fácil de hacerlo?
>
> Scrip para generar tabla y data de ejemplo
>
> DROP TABLE IF EXISTS "trabajo_proceso"."orden_registro";
> CREATE TABLE "trabajo_proceso"."orden_registro" (
> "empleado_id" varchar(5) COLLATE "default",
> "orden" varchar(15) COLLATE "default",
> "operacion" varchar(4) COLLATE "default",
> "fecha_inicial" timestamp(6),
> "fecha_final" timestamp(6),
> "orden_registro_id" int4 DEFAULT 0 NOT NULL
> )
> WITH (OIDS=FALSE) ;
>
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8786596', 'O-15', '2016-09-07 06:00:00', '2016-09-07 06:20:00', '1');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8797911', 'O-15', '2016-09-07 06:20:00', '2016-09-07 06:40:00', '2');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8794746', 'O-15', '2016-09-07 06:40:00', '2016-09-07 07:00:00', '3');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8789909', 'O-15', '2016-09-07 07:00:00', '2016-09-07 07:10:00', '4');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8788288', 'O-15', '2016-09-07 07:10:00', '2016-09-07 07:30:00', '5');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8783454', 'O-15', '2016-09-07 07:30:00', '2016-09-07 07:45:00', '6');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012', 'AI-8',
> 'O-10', '2016-09-07 07:45:00', '2016-09-07 08:10:00', '7');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8796366', 'O-15', '2016-09-07 08:10:00', '2016-09-07 08:48:00', '8');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ACA-1537543', 'O-10', '2016-09-07 08:48:00', '2016-09-07 08:55:00', '9');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ACA-1537441', 'O-05', '2016-09-08 10:23:00', '2016-09-08 10:27:00', '10');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ACA-1537426', 'O-10', '2016-09-08 10:27:00', '2016-09-08 11:09:00', '11');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8789258', 'O-15', '2016-09-08 11:09:00', '2016-09-08 11:24:00', '12');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8788558', 'O-10', '2016-09-08 11:24:00', '2016-09-08 11:26:00', '13');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ARM-8785940', 'O-15', '2016-09-08 11:26:00', '2016-09-08 12:23:00', '14');
> INSERT INTO "trabajo_proceso"."orden_registro" VALUES ('X0012',
> 'ACA-1537547', 'O-11', '2016-09-08 12:23:00', '2016-09-08 12:41:00', '15');
>
> ALTER TABLE "trabajo_proceso"."orden_registro" ADD PRIMARY KEY
> ("orden_registro_id");
>
>
>
> DROP TABLE IF EXISTS "trabajo_proceso"."tiempo_para";
> CREATE TABLE "trabajo_proceso"."tiempo_para" (
> "empleado_id" varchar(5) COLLATE "default",
> "fecha_incial" timestamp(6),
> "fecha_final" timestamp(6)
> )
> WITH (OIDS=FALSE) ;
>
> INSERT INTO "trabajo_proceso"."tiempo_para" VALUES ('X0012', '2016-09-07
> 06:22:00', '2016-09-07 06:25:00');
> INSERT INTO "trabajo_proceso"."tiempo_para" VALUES ('X0012', '2016-09-07
> 08:03:00', '2016-09-07 08:17:00');
> INSERT INTO "trabajo_proceso"."tiempo_para" VALUES ('X0012', '2016-09-08
> 11:12:00', '2016-09-08 11:18:00');
>
>
>
> Saludos.
> Mauricio
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message heriberto giron 2016-09-12 15:05:16 INCONVENINETES CON VACUUM
Previous Message Guillermo E. Villanueva 2016-09-12 10:42:22 Re: Ayuda con SP Postgresql 9.4