1. ホーム
  2. sql

[解決済み] Oracle の Date データ型が SQL によって 'YYYY-MM-DD HH24:MI:SS TMZ' に変換される。

2022-02-15 16:57:30

質問事項

Oracle Dataのデータ型カラムにアップロードするアプリケーションを経由しています。

TO_TIMESTAMP_TZ('2012-10-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR')

このDataカラムから、以下のフォーマットとタイムゾーンを取り出す必要があります。 'yyyy-mm-dd hh24:mi:ss cdt' です。

注:日付はCSTでアップロードされていますが、CDTで返される必要があります。

ググってみましたが、Dateデータ型については、以下のものしか見つかりませんでした。

SELECT dateColumn From dateTable;
09-NOV-12

SELECT TO_CHAR(dateColumn,'YYYY-MM-DD HH24:MI:SS') From dateTable;
2012-10-09 1:10:21

以下も試してみました。

TO_TIMESTAMP_TZ(dateColumn,'YYYY-MM-DD HH24:MI:SS CDT')
data format not recognized

TO_TIMESTAMP_TZ(CRTE_DT,'YYYY-MM-DD HH24:MI:SS TZH:TZM')
09-NOV-12 1:10:21 AM +01:00
don't understand why this does not come back as YYYY-MM-DD?

どうすればこの問題を解決できますか?

どのように解決するのですか?

ご質問の中に少し混乱があります。

  • a Date データ型は、タイムゾーンのコンポーネントを保存しません。を挿入すると、この情報は切り捨てられ、永遠に失われてしまいます。 TIMESTAMP WITH TIME ZONE の中に Date .
  • 日付を画面上に表示したり、文字API(XML、ファイル...)を介して他のシステムに送信したりする場合、以下のように使用します。 TO_CHAR という関数があります。オラクルでは a Date には書式がありません。 : それはある時点のものです。
  • 逆に、次のように使用します。 TO_TIMESTAMP_TZ を変換するために VARCHAR2TIMESTAMP しかし、これでは DateTIMESTAMP .
  • 使用するのは FROM_TZ にタイムゾーン情報を追加する。 TIMESTAMP (または Date ).
  • オラクルでは CST はタイムゾーンですが CDT がない。 CDT はデイライトセービング情報です。
  • さらにややこしいことに CST/CDT ( -05:00 ) と CST/CST ( -06:00 ) は明らかに異なる値を持ちますが、タイムゾーン CST は、デフォルトで日付に応じたサマータイム情報を継承します。

そのため、変換は見た目ほど単純ではないかもしれません。

を変換すると仮定すると Date d タイムゾーンで有効であることが分かっている CST/CST をタイムゾーンで同等の CST/CDT を使用することになります。

SQL> SELECT from_tz(d, '-06:00') initial_ts,
  2         from_tz(d, '-06:00') at time zone ('-05:00') converted_ts
  3    FROM (SELECT cast(to_date('2012-10-09 01:10:21',
  4                              'yyyy-mm-dd hh24:mi:ss') as timestamp) d
  5            FROM dual);

INITIAL_TS                      CONVERTED_TS
------------------------------- -------------------------------
09/10/12 01:10:21,000000 -06:00 09/10/12 02:10:21,000000 -05:00

ここでは、私のデフォルトのタイムスタンプのフォーマットが使用されています。明示的にフォーマットを指定することもできますね。

SQL> SELECT to_char(from_tz(d, '-06:00'),'yyyy-mm-dd hh24:mi:ss TZR') initial_ts,
  2         to_char(from_tz(d, '-06:00') at time zone ('-05:00'),
  3                 'yyyy-mm-dd hh24:mi:ss TZR') converted_ts
  4    FROM (SELECT cast(to_date('2012-10-09 01:10:21',
  5                              'yyyy-mm-dd hh24:mi:ss') as timestamp) d
  6            FROM dual);

INITIAL_TS                      CONVERTED_TS
------------------------------- -------------------------------
2012-10-09 01:10:21 -06:00      2012-10-09 02:10:21 -05:00