PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Manipulação de fuso horário peculiar em um banco de dados Postgres


O problema parece não estar relacionado ao Amazon RDS:tem a ver com a convenção usada pelo PostgreSQL. Nesse caso, você faz ter o nome do fuso horário para trás. Você quer dizer 'UTC-01' onde você escreve 'UTC+01' .
Do manual :

Portanto, a string de fuso horário usada para SET TIME ZONE (e a exibição de SHOW timezone , em conformidade) ou o AT TIME ZONE construção use o sinal oposto do que é exibido em timestamp (with time zone ) literais! Esse é um desacordo muito infeliz entre o padrão ISO e SQL, por um lado, e o POSIX, por outro. (Acho que o POSIX é o culpado.) Veja:

Mas 'CET' ou 'UTC-01' ambos ainda estão potencialmente errados para Paris porque eles não estão adotando regras para o horário de verão em conta.
(DST é um dos conceitos mais idiotas da história da humanidade.)

Paris (como a maioria da Europa) usa CET durante o inverno e CEST durante o verão. Seus testes com 'CET' apenas acontecer de trabalhar em novembro. Se você tentar o mesmo no horário de verão, obterá o resultado errado.

Para garantir a segurança, sempre use o nome do fuso horário 'Europe/Paris' , que considera as regras do horário de verão. A ligação é mais cara.

A função current_time leva em consideração as regras de horário de verão se sua configuração de fuso horário implicar em alguma. Mas 'UTC-01' é um deslocamento de tempo simples. Eu nunca uso o tipo de dados time with time zone ou current_time começar com. O manual mais uma vez:

Considerar:
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_winter
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST'   AS cest_summer
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_no_dst  -- CET wrong!
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer
     , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter

Relacionado: