1

日付フィールドが複数の形式で VARCHAR2 に格納されている古いテーブルがあります。現在、次のことを計画しています。

1) これらのデータを適切な日付フィールドを持つビューに保存します。

2) また、これらを MM/DD/YYYY のような単一の一貫した形式で保存します。

#1で行われることは次のとおりです。VARCHAR2を解析して、次のようなさまざまな形式のDATEに変換できるように関数を作成しました。

IF dataTobeConverted IS NOT NULL
        THEN
            IF substr(dataTobeConverted,3,1) = '-'
             THEN retDate:= TO_DATE(dataTobeConverted,'DD-MON-YYYY');
            END IF;

            IF substr(dataTobeConverted,3,1) = '/'
             THEN retDate:= TO_DATE(dataTobeConverted,'MM/DD/YYYY');
            END IF;
        END IF;

RETURN retDate;

#2 については、上記の 2 つの日付を MM/DD/YYYY に変換する必要があります。一方は既にこの形式になっているため、条件を保存する場合は、最初にもう一方 ('DD-MON-YYYY') を変換する必要があります。ビューの日付フィールドの MM/DD/YYYY で。そのため、日付を日付に変換する必要があります (ある形式から別の形式に変換し、日付を返します)。

前もって感謝します!

4

4 に答える 4

1

これらのデータをビューに保存します

ビューは実際のデータを保存しません。これは単なる保存されたselectステートメントであり、それ以上のものではありません。

ビューの日付フィールドに MM/DD/YYYY で格納される最初の if 条件

日付を表す文字列リテラルを特定の形式を使用して DATE データ型の値に変換しても、変換された値がその形式で格納されるわけではありません。関数の 2 番目のパラメーターとしてフォーマット マスクを指定するとTO_DATE()、DATE データ型の値に適切な内部表現を与えるようにオラクルに通知するだけです。日付は特定の形式で保存されません。つまり、文字列リテラルを DATE データ型の値に変換したら、to_char()関数を使用してその日付を任意の形式で表示するか、によって設定された日付表現形式マスクに依存するだけですnls_date_format

SQL> with t1(col) as(
  2    select to_date('21-10-2013', 'dd-mm-yyyy') from dual union all
  3    select to_date('21/10/2013', 'dd/mm/yyyy') from dual union all
  4    select to_date('21.10.2013', 'dd.mm.yyyy') from dual
  5  )
  6  select to_char(col, 'dd/mm/yyyy') as res
  7    from t1
  8  ;


RES
----------
21/10/2013
21/10/2013
21/10/2013
于 2013-10-21T10:11:22.270 に答える
0

Przemyslaw Kruglej が正しく指摘しているように、日付を varchar2 に格納するべきではありません。これは言った:

テーブルを変更する oldtable を追加する new_date 日付;

oldtable セットの更新 new_date =
  場合
    when substr(old_date,3,1) = '-' then to_date(old_date,'DD-MON-YYYY')
    when substr(old_date,3,1) = '/' then to_date(old_date,'MM/DD/YYYY')
    そうでなければヌル
  終わり
ここで、old_date は null ではありません。

すべての日付が認識されたかどうかを確認します。

select * from oldtable where old_date is not null and new_date is null;

やっと:

alter table oldtable drop old_date;
于 2013-10-21T10:22:15.053 に答える
0

私が正しく理解している場合は、再度変換する必要はありません。文字列をデータ型に変換した場合、元の日付がデータ型DATEなどにどのように変換されても、同じ方法で格納されます。VARCHAR2ように見えた。

ユーザーにデータを表示する方法は、関数などを使用して指定するセッション パラメーターまたはモデル形式によって異なりますTO_CHAR。ただし、内部的には、 aDATEは形式モデルなしで格納されます。

于 2013-10-21T10:02:11.920 に答える