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

Jak działa funkcja timezone() w PostgreSQL

W PostgreSQL możesz użyć timezone() funkcja konwersji znacznika czasu na inną strefę czasową.

Składnia

Składnia wygląda tak:

timezone(zone, timestamp) 

Gdzie zone jest strefą czasową, w której chcesz umieścić timestamp argument, na który ma zostać przekonwertowany.

Otrzymany wynik będzie zależał od tego, czy oryginalna wartość znacznika czasu zawiera strefę czasową, czy nie (i jaka jest ta wartość).

Przykład 1 – kiedy oryginalny znacznik czasu zawiera strefę czasową

Oto, co się dzieje, gdy oryginalny znacznik czasu zawiera strefę czasową.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00'); 

Wynik:

2020-10-25 04:00:00

Gdy oryginalny znacznik czasu zawiera strefę czasową, timezone() funkcja przesuwa oryginalną wartość znacznika czasu do określonej strefy czasowej i zwraca wartość bez strefy czasowej.

Oto, co się stanie, jeśli zmienię strefę czasową znacznika czasu wejściowego.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01'); 

Wynik:

2020-10-25 03: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 oryginalna wartość znacznika czasu jest przenoszona do lokalnej strefy czasowej.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00'); 

Wynik:

2020-10-24 18:00:00

W tym przypadku uzyskany znacznik czasu został cofnięty o sześć godzin. Oznacza to, że moja lokalna strefa czasowa jest o sześć godzin przed Indian/Mauritius.

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 '2020-10-25 00:00:00'; 

Wynik:

2020-10-25 00:00:00+10

Przykład 2 – Kiedy oryginalny znacznik czasu NIE zawiera strefy czasowej

Oto, co się dzieje, gdy oryginalny znacznik czasu nie zawierać strefę czasową.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00'); 

Wynik:

2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12'); 

Wynik:

2020-10-25 06: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 '2020-10-25 00:00:00+12'; 

Wynik:

2020-10-25 00:00:00

Przykład 3 – lokalny znacznik czasu

Użyjmy localtimestamp funkcja do uruchomienia porównania między bieżącym znacznikiem czasu w mojej własnej strefie czasowej a wynikowym znacznikiem czasu po użyciu timezone() funkcji, aby przekonwertować go na inną strefę czasową.

\x
SELECT 
  localtimestamp,
  timezone('Indian/Mauritius', localtimestamp); 

Wynik:

lokalny znacznik czasu | 2020-07-08 15:42:04.965221strefa czasowa | 2020-07-08 21:42:04.965221+10

localtimestamp funkcja zwraca sygnaturę czasową typ danych, który pochodzi z niejawnym „bez strefy czasowej”. Innymi słowy, sygnatura czasowa i sygnatura czasowa bez strefy czasowej są tym samym.

Jak pokazano wcześniej, gdy w oryginalnym znaczniku czasu nie określono strefy czasowej, bieżąca TimeZone ustawienie jest używane i dołączane do wyniku. I to właśnie otrzymujemy, używając localtimestamp .

Przy okazji, w tym przykładzie użyłem \x aby wyświetlić wynik za pomocą rozszerzonego wyświetlania/wyjścia pionowego, aby ułatwić czytanie.

Przykład 4 – aktualny_sygnatura czasowa

Teraz użyjmy current_timestamp funkcja zamiast localtimestamp .

SELECT 
  current_timestamp,
  timezone('Indian/Mauritius', current_timestamp); 

Wynik (przy użyciu wyjścia pionowego):

bieżąca_sygnatura czasowa | 2020-07-08 15:42:04.335669+10strefa czasowa | 2020-07-08 09:42:04.335669

Tym razem przesunięcie strefy czasowej zostało dołączone do oryginalnego znacznika czasu, a timezone() wynik już go nie zawiera.

Otrzymujemy ten wynik, ponieważ current_timestamp funkcja zwraca znacznik czasu ze strefą czasową typ danych.

Przykład 5 – Korzystanie z wartości czasu

timezone() funkcja działa również z time wartości (time with time zone i time without time zone ).

Jednak gdy używasz go w time with time zone wartości, przesunięcie strefy czasowej jest dodawane do wyniku.

SELECT 
  timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time with time zone '00:00:00'); 

Wynik (przy użyciu wyjścia pionowego):

strefa czasowa | 04:00:00+04strefa czasowa | 03:00:00+04strefa czasowa | 18:00:00+04

A dla kompletności, oto te same wartości przy użyciu time without time zone typ danych.

SELECT 
  timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time without time zone '00:00:00'); 

Wynik (przy użyciu wyjścia pionowego):

strefa czasowa | 18:00:00+04strefa czasowa | 18:00:00+04strefa czasowa | 18:00:00+04

Sprawdź lokalną strefę czasową

Jeśli chcesz sprawdzić swoją lokalną strefę czasową, uruchom SHOW TIMEZONE .

Oto, co otrzymuję po uruchomieniu tego polecenia.

SHOW TIMEZONE; 

Wynik:

Australia/Brisbane

Sprawdź przesunięcie strefy czasowej

Uzbrojony w powyższą wiedzę, mogę teraz sprawdzić dwa przesunięcia stref czasowych, wysyłając zapytanie do pg_timezone_names widok.

SELECT * 
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane'; 

Wynik (przy użyciu wyjścia pionowego):

nazwa | skrót | utc_offset | is_dst---------+---------+------------+------ --Indyjski/Mauritius | +04 | 04:00:00 | fAustralia/Brisbane | AEST | 10:00:00 | f

Zobacz Zwracanie listy stref czasowych obsługiwanych przez PostgreSQL, aby uzyskać więcej opcji i przykładów zwracania strefy czasowej w Postgresie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd parametrów połączenia libpq sslpassword w PostgreSQL 13

  2. Jak utworzyć pojedynczy punkt końcowy dla konfiguracji replikacji PostgreSQL za pomocą HAProxy?

  3. Przegląd zmian indeksów w PostgreSQL 11

  4. Całkowicie odinstalować PostgreSQL 9.0.4 z Mac OSX Lion?

  5. Wielokrotne wywołanie funkcji zwracającej zestaw z argumentem tablicowym