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

Jak przekonwertować pole znacznika czasu na ciąg ISO 8601 w danej strefie czasowej?

Możesz bawić się parametrami GUC datestyle i timezone wewnątrz funkcji, aby uzyskać to, czego chcesz. Oto przykład (zwraca jednak mikrosekundy, więc prawdopodobnie będziesz musiał go trochę dostroić):

create or replace function timestamp_iso8601(ts timestamptz, tz text) returns text as $$
declare
  res text;
begin
  set datestyle = 'ISO';
  perform set_config('timezone', tz, true);
  res := ts::timestamptz(3)::text;
  reset datestyle;
  reset timezone;
  return replace(res, ' ', 'T') || ':00';
end;
$$ language plpgsql volatile;

Wyniki:

test=# select timestamp_iso8601(now()::timestamptz, 'Europe/Moscow');
       timestamp_iso8601
-------------------------------
 2017-07-12T08:56:58.692985+03:00

test=# select timestamp_iso8601(now()::timestamptz, 'Pacific/Auckland');
       timestamp_iso8601
-------------------------------
 2017-07-12T17:59:05.863483+12:00
(1 row)

Aktualizacja:edytowane. Możesz użyć timestamptz(3) , określając precyzję (domyślnie będzie to mikrosekundy, podczas gdy 3 zachowa tylko milisekundy). Alternatywnie możesz użyć res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); zamiast ::timestamptz(3)::text łańcuch konwersji, w tym przypadku (3) nie będą potrzebne.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 sposobów na znalezienie zduplikowanych wierszy w PostgreSQL, ignorując klucz podstawowy

  2. Jak ustawić automatyczny przyrost klucza podstawowego w PostgreSQL?

  3. Dodawanie klucza obcego do modelu rails

  4. Pobierz dane z php do skryptu c#

  5. Jak działa justify_interval() w PostgreSQL