AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 30787
Accepted
sufleR
sufleR
Asked: 2012-12-20 15:50:45 +0800 CST2012-12-20 15:50:45 +0800 CST 2012-12-20 15:50:45 +0800 CST

"AT TIME ZONE" com nome de zona Bug do PostgreSQL?

  • 772

Eu estava respondendo a esta pergunta do stackoverflow e encontrei um resultado estranho:

 select * from  pg_timezone_names where name = 'Europe/Berlin' ;
     name      | abbrev | utc_offset | is_dst 
---------------+--------+------------+--------
 Europe/Berlin | CET    | 01:00:00   | f

e próxima consulta

select id, 
  timestampwithtimezone, 
  timestampwithtimezone at time zone 'Europe/Berlin' as berlin, 
  timestampwithtimezone at time zone 'CET' as cet 
from data ;
 id  | timestampwithtimezone  |       berlin        |         cet         
 -----+------------------------+---------------------+---------------------
 205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
 204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
 203 | 2012-10-28 02:30:00+02 | 2012-10-28 02:30:00 | 2012-10-28 01:30:00
 202 | 2012-10-28 02:59:59+02 | 2012-10-28 02:59:59 | 2012-10-28 01:59:59
 106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00

Estou usando o PostgreSQL 9.1.2 e o Ubuntu 12.04.
Acabei de verificar que em 8.2.11 o resultado é o mesmo.

De acordo com a documentação , não importa se eu uso nome ou abreviação.

Isso é um inseto?
Estou fazendo algo errado?
Alguém pode explicar esse resultado?

EDIT Pelo comentário de que CET não é Europa/Berlim.

Estou apenas selecionando valores de pg_timezone_names.

select * from  pg_timezone_names  where abbrev ='CEST';
 name | abbrev | utc_offset | is_dst 
------+--------+------------+--------

e

select * from  pg_timezone_names  where abbrev ='CET';
        name         | abbrev | utc_offset | is_dst 
---------------------+--------+------------+--------
 Africa/Tunis        | CET    | 01:00:00   | f
 Africa/Algiers      | CET    | 01:00:00   | f
 Africa/Ceuta        | CET    | 01:00:00   | f
 CET                 | CET    | 01:00:00   | f
 Atlantic/Jan_Mayen  | CET    | 01:00:00   | f
 Arctic/Longyearbyen | CET    | 01:00:00   | f
 Poland              | CET    | 01:00:00   | f
 .....

Durante o inverno Europa/Berlim é +01. Durante o verão é +02.

EDIT2 Em 28/10/2012, o fuso horário mudou do horário de verão para o horário de inverno às 2:00.
Esses dois registros têm o mesmo valor na Europa/Berlim:

204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00

Isso sugere que, se eu usar uma das abreviações (CET ou CEST) para o intervalo de big data (horário de verão e inverno), o resultado estará errado para alguns dos registros. Será bom se eu usar 'Europe/Berlin'.

Alterei a hora do sistema para '2012-01-17' e pg_timezone_names também mudou.

select * from  pg_timezone_names  where name ='Europe/Berlin';
     name      | abbrev | utc_offset | is_dst 
---------------+--------+------------+--------
 Europe/Berlin | CEST   | 02:00:00   | t
postgresql timestamp
  • 3 3 respostas
  • 6443 Views

3 respostas

  • Voted
  1. Best Answer
    Mike Sherrill 'Cat Recall'
    2012-12-20T19:06:54+08:002012-12-20T19:06:54+08:00

    Na verdade, a documentação diz claramente que o nome e a abreviação do fuso horário se comportarão de maneira diferente.

    Resumindo, esta é a diferença entre abreviações e nomes completos: as abreviações sempre representam um deslocamento fixo do UTC, enquanto a maioria dos nomes completos implica uma regra de horário de verão local e, portanto, tem dois deslocamentos UTC possíveis. Referência

    FWIW, essa mesma referência também diz

    Não recomendamos o uso do tipo time com fuso horário (embora seja suportado pelo PostgreSQL para aplicativos legados e para conformidade com o padrão SQL).

    • 9
  2. Erwin Brandstetter
    2012-12-28T08:41:41+08:002012-12-28T08:41:41+08:00

    E isso ainda não é o essencial! Eu me deparei com um problema muito semelhante há algum tempo.

    As principais desvantagens das abreviações de fuso horário já foram apresentadas aqui: elas não levam em consideração o horário de verão (horário de verão). O principal pró: simplicidade resultando em desempenho superior . Levar em consideração as regras de horário de verão torna os nomes de fuso horário lentos em comparação. As abreviações de fuso horário são deslocamentos de tempo simbólicos simples, os nomes de fuso horário estão sujeitos a um conjunto de regras em constante mudança. Corri benchmarks nesta resposta relacionada em SO , a diferença é notável. Mas, quando aplicado a um conjunto, normalmente é necessário usar nomes de fuso horário para cobrir status de horário de verão possivelmente diferentes por linha (e também diferenças históricas).

    Estamos falando do CET . A parte realmente complicada é que "CET" não é apenas (obviamente) uma abreviação de fuso horário , é também um nome de fuso horário , pelo menos de acordo com minha instalação (PostgreSQL 9.1.6 no Debian Squeeze com localidade "de_AT.UTF-8 ") e todos os outros que vi até agora. Menciono esses detalhes porque o Postgres usa as informações de localidade do sistema operacional subjacente, se disponível.

    Veja por si mesmo:

    SELECT * FROM pg_timezone_names WHERE name = 'CET';
    
    SELECT * FROM pg_timezone_abbrevs WHERE abbrev = 'CET';
    

    SQL Fiddle.

    Postgres escolhe a abreviação sobre o nome completo. Portanto, embora eu tenha encontrado CET nos nomes de fuso horário , a expressão '2012-01-18 01:00 CET'::timestamptzé interpretada de acordo com as regras sutilmente diferentes para abreviações de fuso horário .

    Se isso não é uma espingarda carregada, não sei o que é.

    Para evitar ambiguidades, use o nome do fuso horário 'Europa/Berlim' (ou 'Europa/Viena' no meu caso - que é efetivamente o mesmo, exceto pelas diferenças históricas). Encontre mais detalhes sobre o tópico na pergunta intimamente relacionada que mencionei acima .

    Para encerrar, gostaria de expressar meu profundo desprezo pelo conceito idiota de horário de verão. Deve ser removido da existência e nunca mais falado.

    • 6
  3. dezso
    2012-12-21T00:15:27+08:002012-12-21T00:15:27+08:00

    Verifique isto:

    select  
        '2012-10-28 02:30:00+02'::timestamp with time zone at time zone 'Europe/Berlin' as berlin,
        '2012-10-28 02:30:00+02'::timestamp with time zone at time zone 'CET' as cet,
        '2012-10-28 02:30:00+02'::timestamp with time zone at time zone 'CEST' as cest
    

    +02é CEST em Berlim, não CET.

    • 3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve