3

Oracle SQL ストアド プロシージャで date/timeztamp をあるタイムゾーンから別のタイムゾーンに変換するにはどうすればよいですか? DB サーバーは、DB に接続するマシンと同様に GMT を使用するように設定されていますが、夏時間であるかどうかに応じて、データは CST または CDT で保存する必要があります。

私はこのSQLが機能しています:

select to_char(from_tz(TO_TIMESTAMP(to_char(SYSDATE,'mm-dd-yyyy hh24:mi:ss'), 'mm-dd-yyyy hh24:mi:ss'),'GMT')  at time zone 'CST6CDT','mm-dd-yyyy hh24:mi:ss') from dual;

しかし、それをプロシージャに入れると、次のエラーで失敗します: ORA-01843: 有効な月ではありません

これは私が手順のために持っているものです:

declare 
p_systemDT TIMESTAMP WITH TIME ZONE;
BEGIN
select to_char(from_tz(TO_TIMESTAMP(to_char(SYSDATE,'mm-dd-yyyy hh24:mi:ss'), 'mm-dd-yyyy hh24:mi:ss'),'GMT')  at time zone 'CST6CDT','mm-dd-yyyy hh24:mi:ss')  into p_systemDT  from dual;
DBMS_OUTPUT.PUT_LINE('p_systemDT = ' || p_systemDT);
end;
4

1 に答える 1

1

まず、を使用SYSTIMESTAMPして a を返すことができます (私の場合、サーバーは GMT から 5 時間遅れた米国/東部時間帯で実行されています)。これを取得してタイムスタンプに変換するTIMESTAMP WITH TIME ZONE必要はありません。SYSDATE

SQL> select systimestamp
  2    from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
10-DEC-12 12.39.51.755000 PM -05:00

その後、任意のタイム ゾーンに変換できSYSTIMESTAMPます (この場合は「CST6CDT」)。

SQL> ed
Wrote file afiedt.buf

  1  select systimestamp at time zone 'CST6CDT'
  2*   from dual
SQL> /

SYSTIMESTAMPATTIMEZONE'CST6CDT'
---------------------------------------------------------------------------
10-DEC-12 11.40.14.491000 AM CST6CDT

そして、文字列のフォーマットを指定したい場合は、to_char

SQL> ed
Wrote file afiedt.buf

  1  select to_char( systimestamp at time zone 'CST6CDT', 'mm-dd-yyyy hh24:mi:ss' )
  2*   from dual
SQL> /

TO_CHAR(SYSTIMESTAM
-------------------
12-10-2012 11:40:48
于 2012-12-10T17:43:23.893 に答える