W PostgreSQL możesz użyć AT TIME ZONE
klauzula konwertująca znacznik czasu na inną strefę czasową.
Składnia
Możesz go używać w jednym z trzech następujących wariantów:
timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone
Gdzie zone
to strefa czasowa, na którą chcesz przekonwertować wartość po lewej stronie.
Dla jasności, jedyną różnicą między tymi trzema wariantami jest typ danych konwertowanego znacznika czasu.
Trzy typy danych to:
timestamp with time zone
timestamp without time zone
time with time zone
Otrzymany wynik będzie zależał od typu danych.
Poniższa tabela przedstawia wyniki, jakie daje każdy wariant.
Wyrażenie | Typ zwrotu | Opis |
---|---|---|
znacznik czasu ze strefą czasową W STREFIE CZASOWEJ | timestamp without time zone | Konwertuj podany znacznik czasu ze strefą czasową do nowej strefy czasowej, bez oznaczenia strefy czasowej |
znacznik czasu bez strefy czasowej W STREFIE CZASOWEJ | timestamp with time zone | Traktuj podany znacznik czasu bez strefy czasowej jak znajduje się w określonej strefie czasowej |
czas ze strefą czasową AT TIME STREFA | time with time zone | Konwertuj podany czas ze strefą czasową do nowej strefy czasowej |
Wariant 1
Oto, co się dzieje, gdy skonwertujesz timestamp with time zone
wartość.
SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Wynik:
2025-11-20 02:00:00
Kiedy oryginalny znacznik czasu to timestamp with time zone
wartość, jest przesuwana do określonej strefy czasowej, a wynik jest zwracany bez przesunięcia strefy czasowej.
Oto, co się stanie, jeśli zmienię przesunięcie strefy czasowej wartości wejściowej.
SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Wynik:
2025-11-20 01:00:00
Wynikowy znacznik czasu jest przesuwany zgodnie z wprowadzoną strefą czasową.
A jeśli określisz timestamp with time zone
, ale oryginalny znacznik czasu w rzeczywistości nie zawiera strefy czasowej, wówczas zakładana jest lokalna strefa czasowa.
SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Wynik:
2025-11-19 16:00:00
W tym przypadku uzyskany znacznik czasu został cofnięty o osiem godzin. Oznacza to, że moja lokalna strefa czasowa jest osiem godzin przed Afryką/Kairem.
Możemy zobaczyć przesunięcie strefy czasowej, które zostało użyte, wybierając bezpośrednio wartość wejściową.
SELECT timestamp with time zone '2025-11-20 00:00:00';
Wynik:
2025-11-20 00:00:00+10
Wariant 2
Oto, co się dzieje, gdy oryginalny znacznik czasu używa timestamp without time zone
wartość.
Innymi słowy, nie zawierać strefę czasową.
SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Wynik:
2025-11-20 08:00:00+10
Gdy oryginalny znacznik czasu nie zawiera strefy czasowej, wynik jest wyświetlany przy użyciu bieżącej TimeZone
ustawienie i dołączane jest przesunięcie strefy czasowej.
Ma to zastosowanie za każdym razem, gdy określisz timestamp without time zone
, nawet jeśli znacznik czasu faktycznie zawiera przesunięcie strefy czasowej.
SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';
Wynik:
2025-11-20 08:00:00+10
Należy się tego spodziewać, ponieważ jeśli wybiorę tylko timestamp without time zone
wartość, oto co otrzymuję:
SELECT timestamp without time zone '2025-11-20 00:00:00+12';
Wynik:
2025-11-20 00:00:00
Wariant 3
Oto, co się dzieje, gdy oryginalny znacznik czasu używa time with time zone
wartość.
SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Wynik:
02:00:00+02
Konwertuje podany time with time zone
wartość do nowej strefy czasowej i dołącza przesunięcie strefy czasowej do wyniku.
Oto, co się stanie, jeśli zmienię przesunięcie strefy czasowej wartości wejściowej.
SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Wynik:
01:00:00+02
Wynikowy znacznik czasu jest przesuwany zgodnie z wprowadzoną strefą czasową.
A jeśli określisz time with time zone
, ale oryginalny znacznik czasu tak naprawdę nie zawiera strefy czasowej, zakładana jest lokalna strefa czasowa.
SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Wynik:
16:00:00+02
W tym przypadku otrzymany znacznik czasu został cofnięty o osiem godzin (ponieważ moja lokalna strefa czasowa jest o osiem godzin przed Afryką/Kairem).
Możemy zobaczyć przesunięcie strefy czasowej, które zostało użyte, wybierając bezpośrednio wartość wejściową.
SELECT time with time zone '00:00:00';
Wynik:
00:00:00+10
Czas bez strefy czasowej
Chociaż dokumentacja Postgresa nie zawiera time without time zone
wariant, oto przykład.
SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Wynik:
16:00:00+02
Tak więc w tym przykładzie założono, że strefa czasowa ma zostać przekonwertowana.