sql >> データベース >  >> RDS >> PostgreSQL

特定のタイムゾーンでタイムスタンプフィールドをISO8601文字列に変換するにはどうすればよいですか?

    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. 仕事でより生産的になるための10の効果的な方法

    2. 重複する行を削除し、mysql内のすべての行から1つを保持する必要があります

    3. 一般エラー:1008 OCIStmtExecute:ORA-01008:すべての変数がバインドされていません

    4. ファイルからデータベースに接続できません