Em 9 de março de 2014 13:19, Fabrízio de Royes Mello < [email protected]> escreveu:
> On 09-03-2014 13:17, Fabrízio de Royes Mello wrote: > >> On 09-03-2014 12:23, Bruno Silva wrote: >> >>> 2014-03-08 23:11 GMT-03:00 Fabrízio de Royes Mello >>> <[email protected]>: >>> >>>> On 08-03-2014 22:33, Edson F. Lidorio wrote: >>>> >>>>> >>>>> Pessoal, >>>>> Estou precisando de uma ajuda no sql abaixo: >>>>> Quero pegar somente a parte inteira da subtração de duas data. >>>>> >>>>> select dt_abertura,dt_fim,(dt_fim - dt_abertura)no_dias from osservhe; >>>>> >>>>> dt_abertura | dt_fim | no_dias >>>>> -------------+-------------------------+------------------------ >>>>> 2012-11-18 | 2012-11-18 23:09:09 | 23:09:09 >>>>> 2012-07-23 | 2012-09-18 22:21:10 | 57 days 22:21:10 >>>>> 2012-09-10 | 2012-09-18 22:43:56 | 8 days 22:43:56 >>>>> 2012-09-03 | 2012-09-18 23:44:33 | 15 days 23:44:33 >>>>> 2012-08-05 | 2012-09-21 23:39:09 | 47 days 23:39:09 >>>>> 2012-08-15 | 2012-09-21 23:46:41 | 37 days 23:46:41 >>>>> 2012-08-12 | 2012-09-21 23:49:15 | 40 days 23:49:15 >>>>> 2012-08-06 | 2012-09-22 00:01:15 | 47 days 00:01:15 >>>>> 2012-08-05 | 2012-09-22 00:10:55 | 48 days 00:10:55 >>>>> 2012-07-23 | 2012-09-22 00:16:55 | 61 days 00:16:55 >>>>> 2012-10-26 | 2012-10-26 22:26:29 | 22:26:29 >>>>> 2012-09-10 | 2012-09-18 22:30:58 | 8 days 22:30:58 >>>>> 2012-07-22 | 2012-09-18 22:11:40 | 58 days 22:11:40 >>>>> >>>>> >>>> O resultado da sua subtração é um tipo 'interval' pois tem um timestamp >>>> envolvido. >>>> >>>> Faça o seguinte: >>>> >>>> select dt_abertura, dt_fim, (dt_fim::date - dt_abertura) from osservhe; >>>> >>>> O resultado da subtração de 2 tipos 'date' é um 'integer'; >>>> >>> >>> >>> Use a função extract com epoch. >>> extract( 'epoch' from (dt_fim::date - dt_abertura)) >>> >> >> Bruno, >> >> Não vai funcionar essa sua chamada. Veja as assinaturas possíveis para >> "date_part": >> >> fabrizio=# \df date_part >> List of functions >> Schema | Name | Result data type | Argument data types >> | Type >> ------------+-----------+------------------+---------------- >> -------------------+-------- >> >> pg_catalog | date_part | double precision | text, abstime | >> normal >> pg_catalog | date_part | double precision | text, date | normal >> pg_catalog | date_part | double precision | text, interval | >> normal >> pg_catalog | date_part | double precision | text, reltime | >> normal >> pg_catalog | date_part | double precision | text, timestamp without >> time zone | normal >> pg_catalog | date_part | double precision | text, timestamp with time >> zone | normal >> pg_catalog | date_part | double precision | text, time without time >> zone | normal >> pg_catalog | date_part | double precision | text, time with time zone >> | normal >> (8 rows) >> >> O resultado daquela subtração será um 'integer', logo não existe uma >> 'date_part' que tenha o segundo argumento deste tipo. >> >> > Já estava esquecendo, mesmo que a chamada estivesse correta creio que o > resultado não seria o desejado, pois o retorno do 'epoch' é o nro de > segundos [1], e o retorno desejado é o nro de dias. > Edson, Não seria assim: postgres=# select extract(day FROM Cast('2012-09-18 22:21:10' as timestamp) - Cast('2012-07-23' as timestamp)); date_part ----------- 57 (1 row) postgres=# select extract(day FROM Cast('2012-11-18 23:09:09' as timestamp) - Cast('2012-11-18' as timestamp)); date_part ----------- 0 (1 row) Exemplo2: Tempo em horas usando extract/epoch/age: postgres=# select extract('epoch' from age('2012-11-18 23:09:09','2012-11-18' ))* interval '1 sec' as tempo_horas; tempo_horas ------------- 23:09:09 (1 row) postgres=# select extract('epoch' from age('2012-09-18 22:21:10','2012-07-23' ))* interval '1 sec' as tempo_horas; tempo_horas ------------- 1366:21:10 (1 row)
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
