Em 3 de maio de 2013 15:37, JotaComm <[email protected]> escreveu:

> Olá,
>
>
>
>
> Em 3 de maio de 2013 12:34, Joel Landim Mourão <[email protected]>escreveu:
>
> Amigos, tenho a seguite situação:
>>
>> my_table ( date timestamp );
>>
>
> Quando você cria uma tabela com apenas com timestamp você está criando uma
> tabela sem time zone, é como se sua tabela fosse criada assim:
>
> CREATE TEMP TABLE tmp(data TIMESTAMP); é igual a CREATE TEMP TABLE
> tmp(data TIMESTAMP WITHOUT TIME ZONE);
>
>
>
> select
>>   extract(epoch from DATE_TRUNC('day', date)) AS session_day,
>>   DATE_TRUNC('day', date) AS session_day2
>> FROM my_table
>>
>> result:
>>
>> 1367452800;"2013-05-02 00:00:00"
>> 1367539200;"2013-05-03 00:00:00"
>>
>>
>> select to_timestamp('1367452800')
>> result:
>> "2013-05-01 21:00:00-03"
>>
>>
>> Então o caso que notei, quando pego o resultado session_day2 ele me
>> responde no timezone correto apesar de não ter timezone no campo, porem
>> quando pelo o EPOCH do session_day ele ele aplica o timezone 0 e remove 3
>> horas do resultado, dai na minha APP estou tendo o dia errado, o EPOCH
>> esperado seria o que esta abaixo.
>>
>
>
>
>>
>> select to_timestamp('1367463600')
>> result:
>> "2013-05-02 00:00:00-03"
>>
>> Alguém tem alguma idéia o porque deste comportamento? ou como posso pedir
>> para o epoch ignorar a questão do timezone e me entregar um unixtime
>> literal da data que estou lhe passando?
>>
>> OBS. estou testando no 9.2.2
>>
>
> Agora vamos ao exemplo:
>
> CREATE TEMP TABLE tmp(data TIMESTAMP WITHOUT TIME ZONE);
>
> INSERT INTO tmp VALUES (localtimestamp(0));
>
> postgres=# SELECT * FROM tmp;
>         data
> ---------------------
>  2013-05-03 15:33:10
> (1 row)
>
> E quando você faz:
>
> postgres=# SELECT tmp.data,extract(epoch FROM
> date_trunc('day',tmp.data)),date_trunc('day',tmp.data) AS dia FROM tmp;
>         data         | date_part  |         dia
> ---------------------+------------+---------------------
>  2013-05-03 15:33:10 | 1367539200 | 2013-05-03 00:00:00
> (1 row)
>
> postgres=# SELECT to_timestamp(1367539200);
>       to_timestamp
> ------------------------
>  2013-05-02 21:00:00-03
> (1 row)
>
> Agora vamos a documentação [1]:
>
> [1] http://www.postgresql.org/docs/9.2/interactive/functions-datetime.html
>
> epoch
>
> For timestamp with time zone values, the number of seconds since
> 1970-01-01 00:00:00 UTC (can be negative); for date and timestamp values,
> the number of seconds since 1970-01-01 00:00:00 local time; for 
> intervalvalues, the total number of seconds in the interval
>
> Por isso que você tem esta diferença.
>
>
> Agora se você fizer:
>
> CREATE TEMP TABLE tmp(data TIMESTAMP WITH TIME ZONE);
>
> INSERT INTO tmp VALUES (localtimestamp(0));
>
> postgres=# SELECT * FROM tmp;
>           data
> ------------------------
>  2013-05-03 15:35:59-03
> (1 row)
>
> SELECT tmp.data,extract(epoch FROM
> date_trunc('day',tmp.data)),date_trunc('day',tmp.data) AS dia FROM tmp;
>           data          | date_part  |          dia
> ------------------------+------------+------------------------
>  2013-05-03 15:35:59-03 | 1367550000 | 2013-05-03 00:00:00-03
>
> postgres=# SELECT to_timestamp(1367550000);
>       to_timestamp
> ------------------------
>  2013-05-03 00:00:00-03
> (1 row)
>
> Ao final você terá a resposta esperada.
>
>

Bom sua explicação foi muito boa e entendi a causa do problema. como
solução alterei o tipo do campo para adicionar o timezone, e tudo funcionou
como deveria.

Obrigado.

-- 
Joel Landim Mourão
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a