В основном вы просто используете функцию to_char.
Проблема с вашим примером в том, что хотя теоретически это должно работать:
select to_char( now(), 'YYYY-MM-DDTHH24:MI:SS' );
На самом деле - PostgreSQL не может «понять», что T является разделителем, а HH24 является следующим «тегом», и печатает его как:
2009-03-24THH24:32:45
Но вы можете изменить его относительно просто:
select translate( to_char( now(), 'YYYY-MM-DD HH24:MI:SS' ), ' ', 'T' );
который выводит запрошенный формат:
2009-03-24T21:33:21
Конечно, помня, что всегда использовать translate, довольно быстро устареет, поэтому вместо этого вы можете создать свою собственную функцию и использовать вместо нее:
create function custom_ts(timestamptz) returns text as $$
select translate( to_char( $1, 'YYYY-MM-DD HH24:MI:SS' ), ' ', 'T' );
$$ language sql;
# select custom_ts(now());
custom_ts
---------------------
2009-03-24T21:35:47
(1 row)