PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да конвертирате полето за клеймо за време в низ ISO 8601 в дадена часова зона?

Можете да играете с GUC параметри datestyle и timezone вътре във функция, за да получите това, което искате. Ето един пример (но той връща микросекунди, така че вероятно ще трябва да го настроите малко):

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;

Резултати:

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)

Актуализация:редактирано. Можете да използвате timestamptz(3) , указвайки точността (по подразбиране ще върви с микросекунди, докато 3 ще запази само милисекунди). Като алтернатива можете да използвате res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); вместо ::timestamptz(3)::text верига за преобразуване и в този случай (3) няма да са необходими.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:ФАТАЛНО - Удостоверяването на партньора не бе успешно за потребител (PG::ConnectionBad)

  2. Прост алгоритъм за търсене на графики в SQL (PostgreSQL)

  3. IntegrityError:нарушение на външния ключ при изтриване

  4. Създаване на таблица от MySQL към PostgreSQL - набор от знаци и сортиране

  5. не може да се свърже със сървър за Postgres