sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur konverterar man tidsstämpelfält till ISO 8601-sträng i en given tidszon?

Du kan spela med GUC-parametrar datestyle och timezone inuti en funktion för att få det du vill ha. Här är ett exempel (det returnerar dock mikrosekunder, så förmodligen måste du ställa in det lite):

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;

Resultat:

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)

Uppdatering:redigerad. Du kan använda timestamptz(3) , som anger precisionen (som standard kommer det att gå med mikrosekunder, medan 3 behåller bara millisekunder). Alternativt kan du använda res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); istället för ::timestamptz(3)::text konverteringskedja, och i det här fallet (3) kommer inte att behövas.




  1. Hur konfigurerar man fjäderstartapplikationen för att använda SSL/TLS över MySQL?

  2. Få dagen från ett datum i PostgreSQL

  3. Hur man får värden som inte innehåller siffror i MariaDB

  4. PostgreSQL-fråga som returnerar värden som inte finns i min databas