2015-07-01 13:38 GMT-03:00 Fernando Cambiaghi <[email protected]>:

> Primeiro, creio que você está um pouco enganado, o PostgreSQL não está
> adicionando uma hora. Isso tudo vai depender de como você está inserindo o
> registro, veja que o tipo `timestamp WITH time zone` armazena o valor
> absoluto, e a conversão ao timezone é feito ao exibir. Dependendo do
> formato usado na inserção, pode-se ou não aparecer essa 1 hora a mais no
> resultado (difícil dizer sem mais detalhes).
>
> Então Matheus, na verdade "eu não sei" bem como o insert é feito. Eu
> realizo a transferência dos dados via PipeLine ( Objeto para este fim da
> ferramenta de programação Power Builder ), mas é basicamente ler os dados
> de uma fonte de dados e inserir em outra, como uma ferramenta de ETL, porém
> sem "T", pois não transformo os dados. E os dados estão no banco PostgreSQL
> com 01 na hora, pois quando realizo uma consulta do tipo "SELECT * FROM
> tabela WHERE campo_timestampz = '20150701' ", os registros não são
> localizados, porém, ao alterar a consulta para "SELECT * FROM tabela WHERE
> campo_timestampz >= '20150701' and campo_timestampz < '20150702' " os
> resultados são apresentados,
>

Naturalmente.


> e com o campo_timestamp no seguinte formato "2015-07-01 01:00:00-03".
> ...
>
>
>> Como eu já disse, não. Entretanto, dependendo de como você está
>> informando os dados, você pode ter essa impressão. Por exemplo, se estiver
>> usando um "time zone offset" ao invés do nome:
>>
>>     postgres=# SELECT '2015-02-01 00:00:00-03:00'::timestamptz; -- errado
>>           timestamptz
>>     ------------------------
>>      2015-02-01 01:00:00-02
>>     (1 row)
>>
>>     postgres=# SELECT '2015-02-01 00:00:00
>> America/Sao_Paulo'::timestamptz; -- correto
>>           timestamptz
>>     ------------------------
>>      2015-02-01 00:00:00-02
>>     (1 row)
>>
> Nas minhas aplicações eu não tenho este tipo de casting, nem poderia por
> enquanto, pois as aplicações ainda são para SGDB's diferentes. As consultas
> são realizadas conforme demonstrei mais acima.
>

Não é o CAST que é importante, mas sim o formato foi usado. Pegando por
exemplo a data que você passou (2015-07-01), se tivesse sido inserida
exatamente como '2015-07-01', ficaria:

    postgres=# SELECT '2015-07-01'::timestamptz;
          timestamptz
    ------------------------
     2015-07-01 00:00:00-03
    (1 row)

E não com uma hora a mais como você citou. Mas isso só é verdade se a
aplicação que faz a inserção está usando exatamente o mesmo TimeZone que é
usado ao exibir os dados e não informa o TimeZone no literal (como eu fiz
no e-mail anterior). Por isso eu disse que não é o PostgreSQL que está
adicionando uma hora, é o formato da aplicação ou o TimeZone configurado
durante a inserção.

Eu faria o seguinte, converter de `timestamp WITH time zone` para
`timestamp WITHOUT time zone`, verifique se somente nesta conversão os
valores inseridos virão corretos (com meia noite). Caso ainda tenha
problemas, adicione uma trigger para fazer a correção (mas continue com
`timestamp WITHOUT time zone`, me parece melhor nesse caso).

OBS: Eu digo que `timestamp WITHOUT time zone`  é melhor como uma gambiarra
intermediária, o ideal NESSE CASO seria `date`. Na maioria das situações é
recomendado usa `timestamp WITH time zone` ao invés de WITHOUT.

Atenciosamente,
-- 
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a