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
