PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Специална обработка на часовата зона в база данни на Postgres

Проблемът изглежда несвързан с Amazon RDS:той е свързан с конвенцията, използвана от PostgreSQL. В този случай вие правите имат името на часовата зона наопаки. Имате предвид 'UTC-01' където пишете 'UTC+01' .
От ръководството :

Така че низът за часова зона, използван за SET TIME ZONE (и показването на SHOW timezone , съответно) или AT TIME ZONE конструкция използвайте противоположния знак от това, което се показва в timestamp (with time zone ) литерали! Това е много жалко несъгласие между стандарта ISO и SQL, от една страна, и POSIX, от друга. (Мисля, че POSIX е виновен.) Вижте:

Но 'CET' или 'UTC-01' и двете все още са потенциално грешни за Париж, защото не спазват правила за лятно часово време предвид.
(Лятното часово време е една от най-идиотските концепции в историята на човечеството.)

Париж (както по-голямата част от Европа) използва CET през зимата и CEST през лятото. Вашите тестове с 'CET' случайно работи през ноември. Ако опитате същото през лятото, ще получите грешен резултат.

За по-голяма сигурност винаги използвайте името на часовата зона 'Europe/Paris' , който разглежда правилата за DST. Обаждането е по-скъпо.

Функцията current_time взема под внимание правилата за DST, ако настройката ви за часова зона предполага такива. Но 'UTC-01' е обикновен офсет във времето. Никога не използвам типа данни time with time zone или current_time да започнем с. Ръководството още веднъж:

Помислете за следното:

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

Свързани:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Управление на висока наличност в PostgreSQL – Част II:Мениджър на репликация

  2. Преместване на клъстер от данни postgresql

  3. Използване на PgBouncer Connection Pooler за PostgreSQL с ClusterControl 1.8.2

  4. Какъв е най-бързият начин да направите групово вмъкване в Postgres?

  5. Как в Postgres ограничавате възможните стойности за определена колона?