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

Как работи AT TIME ZONE в PostgreSQL

В PostgreSQL можете да използвате AT TIME ZONE клауза за преобразуване на времева марка в друга часова зона.

Синтаксис

Можете да го използвате с някой от следните три варианта:

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Където zone е часовата зона, към която искате да се преобразува стойността отляво.

Само за да е ясно, единствената разлика между трите варианта е в типа данни на времевата марка, която ще се преобразува.

Трите типа данни са:

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

Резултатът, който ще получите, ще зависи от типа данни.

Следващата таблица очертава резултата, който всеки вариант произвежда.

Израз Тип връщане Описание
timestamp with time zone AT TIME ZONE zone timestamp without time zone Преобразуване на дадено времеви печат в часова зона към новата часова зона, без обозначение на часовата зона
timestamp without time zone AT TIME ZONE zone timestamp with time zone Обработване на даден времеви печат без часова зона както се намира в посочената часова зона
time with time zone AT TIME ZONE zone time with time zone Преобразуване на дадено време с часова зона към новата часова зона

Вариант 1

Ето какво се случва, когато конвертирате timestamp with time zone стойност.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Резултат:

2025-11-20 02:00:00

Когато оригиналното времеви печат е timestamp with time zone стойност, тя се измества към посочената часова зона и резултатът се връща без изместване на часовата зона.

Ето какво се случва, ако променя изместването на часовата зона на входната стойност.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Резултат:

2025-11-20 01:00:00

Полученото времеви печат се измества според въведената часова зона.

И ако посочите timestamp with time zone , но оригиналната времева марка всъщност не включва часова зона, тогава се приема местната часова зона.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Резултат:

2025-11-19 16:00:00

В този случай получената времева марка е върната осем часа назад. Това означава, че моята местна часова зона е с осем часа пред Африка/Кайро.

Можем да видим изместването на часовата зона, което е използвано, като изберем директно входната стойност.

SELECT timestamp with time zone '2025-11-20 00:00:00';

Резултат:

2025-11-20 00:00:00+10

Вариант 2

Ето какво се случва, когато оригиналното времеви печат използва timestamp without time zone стойност.

С други думи, не включва часова зона.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Резултат:

2025-11-20 08:00:00+10

Когато оригиналната времева марка не включва часова зона, резултатът се показва с помощта на текущата TimeZone настройка и отместването на часовата зона се добавя.

Това се прилага всеки път, когато посочите timestamp without time zone , дори ако клеймото за време всъщност съдържа изместване на часовата зона.

SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Резултат:

2025-11-20 08:00:00+10

Това може да се очаква, защото ако избера само timestamp without time zone стойност, това получавам:

SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Резултат:

2025-11-20 00:00:00

Вариант 3

Ето какво се случва, когато оригиналната времева марка използва time with time zone стойност.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Резултат:

02:00:00+02

Той преобразува даденото time with time zone стойност към новата часова зона и добавя изместването на часовата зона към резултата.

Ето какво се случва, ако променя изместването на часовата зона на входната стойност.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Резултат:

01:00:00+02

Полученото времеви печат се измества според въведената часова зона.

И ако посочите time with time zone , но оригиналното времеви печат всъщност не включва часова зона, приема се местната часова зона.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Резултат:

16:00:00+02

В този случай получената времева марка е върната осем часа назад (защото моята местна часова зона е осем часа пред Африка/Кайро).

Можем да видим изместването на часовата зона, което е използвано, като изберем директно входната стойност.

SELECT time with time zone '00:00:00';

Резултат:

00:00:00+10

Време без часова зона

Въпреки че документацията на Postgres не включва time without time zone вариант, ето все пак пример.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Резултат:

16:00:00+02

Така че в този пример се приема местната часова зона за преобразуването на часовата зона.


  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 планета в Ansible Galaxy

  2. Пазете PostgreSQL понякога да избира лош план за заявка

  3. За начинаещ, има ли голяма разлика между MySQL и PostgreSQL

  4. Механизми за физическа репликация в PostgreSQL

  5. Измерване на статистиката на контролните точки на PostgreSQL