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
