В 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 | timestamp without time zone | Преобразуване на дадено времеви печат в часова зона към новата часова зона, без обозначение на часовата зона |
timestamp without time zone AT TIME ZONE | timestamp with time zone | Обработване на даден времеви печат без часова зона както се намира в посочената часова зона |
time with time zone AT TIME 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
Така че в този пример се приема местната часова зона за преобразуването на часовата зона.