2009/7/30 emerson hermann <[email protected]>:
> Ola Lista!
>
> Tenho que auditar uma base de dados, e estou com o seguinte problema:
>
> Como fazer uma query para  o calculo (diferença entre entrada e saida
> do usuario)   data e hora de entrada e de saida do usuario no sistema
> conforme modelagem abaixo?
>
> Desenvolver uma Store Procedure seria a melhor solucao ?
>
> Segue estrutura exemplo da base de dados, abaixo:
>
> -- Versao do PostgreSQL
> SELECT VERSION();
>  PostgreSQL 8.3.0 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.2
>
> -- Estrutura da Tabela
>
> tb_log_acessos
> id_acesso       integer                 not null default
> nextval('tb_log_acessos_id_acesso_seq'::regclass)
> fk_usuario      integer
> login   character varying(77)   not null
> fk_cliente      integer
> data    timestamp without time zone     default now()
> tipo    character(1)
>
> Índices:
>    "tb_log_acessos_pkey" PRIMARY KEY, btree (id_acesso)
> Restrições de verificação:
>    "define_entrada_saida" CHECK (tipo = ANY (ARRAY['E'::bpchar, 'S'::bpchar]))
> Restrições de chave estrangeira:
>    "tb_log_acessos_fk_cliente_fkey" FOREIGN KEY (fk_cliente)
> REFERENCES tb_clientes(id_cliente) ON DELETE RESTRICT
>    "tb_log_acessos_fk_usuario_fkey" FOREIGN KEY (fk_usuario)
> REFERENCES tb_usuarios(id_usuario) ON DELETE SET NULL
>
> -- listagem dos dados
> SELECT *
>   FROM tb_log_acessos;
>
> id_acesso | fk_usuario | login | fk_cliente | data | tipo
> 10312   1       bug     1       01/06/2007 03:29:28      E
> 10315   1       bug     1       01/06/2007 03:31:32      S
> 74929   1       bug     1       01/10/2007 02:59:02      E
> 74930   1       bug     1       01/10/2007 02:59:35      S
> 40171   1       bug     1       02/08/2007 10:44:37      E
> 40172   1       bug     1       02/08/2007 10:48:09      S
> 24340   1       bug     1       03/07/2007 03:30:01      E
> 24344   1       bug     1       03/07/2007 03:32:44      S
> 24345   1       bug     1       03/07/2007 03:33:06      E
>


Talvez algo do tipo:
SELECT *,age(la2.data,la1.data)
  FROM tb_log_acessos la1 JOIN tb_log_acessos la2
       ON (la1.fk_usuario = la2.fk_usuario)
 WHERE la1.tipo = 'E' AND la2.tipo = 'S'
   AND la1.data = (SELECT max(la3.data) FROM tb_log_acessos la3
                    WHERE la3.data < la2.data AND la3.tipo = 'E');

Pelos dados apresentados não foi possível depreender quais atributos
usar no critério da junção.

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a