Restar solamente el tiempo solapado

From: mauricio pullabuestan <jmauriciopb(at)yahoo(dot)es>
To: Pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Restar solamente el tiempo solapado
Date: 2016-09-09 22:46:27
Message-ID: 159772786.4689137.1473461187364@mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Felipe Contreras Oyarzún 2016-09-11 21:58:16 Ayuda con SP Postgresql 9.4
Previous Message Alvaro Herrera 2016-09-08 17:28:56 Re: plphp para postgres