sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan konverteres tidsstempelfelt til ISO 8601-streng i en given tidszone?

Du kan spille med GUC-parametre datestyle og timezone inde i en funktion for at få det, du ønsker. Her er et eksempel (det returnerer dog mikrosekunder, så sandsynligvis bliver du nødt til at justere det lidt):

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;

Resultater:

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)

Opdatering:redigeret. Du kan bruge timestamptz(3) , som angiver præcisionen (som standard vil det gå med mikrosekunder, mens 3 holder kun millisekunder). Alternativt kan du bruge res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); i stedet for ::timestamptz(3)::text konverteringskæde, og i dette tilfælde (3) vil ikke være nødvendigt.




  1. Sammenligning af datoer gemt som varchar

  2. Hvorfor er MySQL InnoDB så meget langsommere ved fuldbordsscanninger end MyISAM?

  3. Find næste gang virksomheden er åben; mysql timer beregning

  4. Hvordan man pivoterer tabeller i MySQL