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 interval values, 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.




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

-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a