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@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a