PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak AT TIME ZONE działa w PostgreSQL

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 zone 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 zone 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 zone 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zliczanie liczby wystąpień podciągu w ciągu w PostgreSQL

  2. Wydajność aplikacji opartych na PostgreSQL:opóźnienia i ukryte opóźnienia

  3. Powolne LEFT JOIN na CTE z interwałami czasowymi

  4. Entity Framework core — zawiera czy wielkość liter jest rozróżniana lub wielkość liter nie jest rozróżniana?

  5. GROUP BY w Postgres - brak równości dla typu danych JSON?