0

varchar 列から日付列を更新しようとしています

update tbl set columnA = columnB

ここで、columnAは varchar データ型で、columnBは日付データ型です。columnAたとえば、09302012、9/30/2012、2012-09-30 など、さまざまなタイプの日付形式があります。

単一のクエリでさまざまなタイプの日付形式で列を更新する単一のクエリを作成するにはどうすればよいですか。

編集:::

混乱について申し訳ありません..私は、これらがssisパッケージの個々の(部分的な)更新であることを認識しました...

make には diff タイプ (6) があり、make ごとに異なる日付形式の異なるファイルを送信します。

タイプ 1 の場合、2011 年 9 月 22 日、2011 年 9 月 22 日、2012 年 9 月 22 日のような日付形式が含まれます。

残りのすべてのタイプは同じ形式に従います..その09222012

だから今、私は個々のタイプのクエリを書く必要があります...(率直に言って、タイプ1用と残りのすべてのタイプ用の2つのロジックのみを話します)

最初のクエリ ロジックには 3 つの形式の case ステートメントが含まれ、2 番目のクエリ ロジックには他の形式のロジックが含まれています...

最終結果は 2012-09-22 00:00:00 (つまり、yyyy-dd-mm hh:mm:ss) のように表示されます。

私はT-sqlの男で、pl-sqlのことを知りません(t-sqlの場合、変換と部分文字列で直接行います)

4

3 に答える 3

2

あなたはそうしない。

まず、次回は適切に実行し、日付をDATEデータ型に格納します。これが提供されたデータである場合、あなたはあなたの供給者に1と叫びます。

データをクリーンアップする最も簡単な方法は、日付が特定の形式であるかどうかをテストする関数を作成することです。

create or replace function is_date ( 
      P_String in varchar2
    , P_Date_Format in varchar2
      ) return number is

   l_date date;

begin

   l_date := to_date(P_String, P_Date_Format);

   return 1;
exception when others then
   return 0;
end;

次に、フォーマットモデルを選択し、そのモデルだけを更新します。

update my_table
   set date_column = to_date(char_column, 'yyyy-mm-dd')
 where is_date(char_column, 'yyyy-mm-dd') = 1

次に、別の形式のモデルを選択し、日付列にNULLのレコードがなくなるまで、もう一度やり直す必要があります。

1.怒鳴るのは少し多いかもしれませんが、必ず聞いてください。


これは、大きなCASEステートメントを使用して単一のクエリにまとめることができます。

update my_table
   set date_column = case when is_date(char_column, 'yyyy-mm-dd') = 1
                               then to_date(char_column, 'yyyy-mm-dd')
                          when is_date(char_column, 'yyyymmdd') = 1
                               then to_date(char_column, 'yyyymmdd')
                          ...
                          snip
                          ...
                     end
于 2012-12-13T19:21:22.483 に答える
0

このような問題が発生した場合、最初の質問は、各行の列Aの日付形式をプログラムで検出する方法です。合理的なLOE内で実行可能であると仮定すると(日付形式の完全な範囲はわかりません)、CASE式を使用して形式を検出し、それぞれの場合に応じて日付を形式化する方法を確認します。

于 2012-12-13T19:24:04.530 に答える
0

あなたの質問を理解できれば、1 つのステートメントでテーブルを更新できるはずです。これは最も洗練されたソリューションではありませんが、次の方法でうまくいくはずです。

UPDATE tbl
   SET columnA = DECODE(type, '1', DECODE(INSTR(columnB, '-'), 5, TO_DATE(columnB, 'YYYY-MM-DD'),
                                                                  TO_DATE(columnB, 'MM/DD/YYYY')),
                                   TO_DATE(columnB, 'MMDDYYYY'));

上記のステートメントでは、列 B の日付形式を示すtypeという名前の列があると想定しています。上記のステートメントでは、DECODE を使用して、型が 1 かどうかを判断します。型 1 には 3 つの可能な形式があるため、ステートメントは次のようになります。次に、columnB の形式を特定してみます。ジョブを簡単にするために、YYYY-MM-DD 形式をテストするだけで済みます。MM/DD/YYYY 形式は 2011 年 9 月 22 日と 9/22 の両方で使用できるからです。 /2011. そのため、INSTR 関数を使用して、最初の「-」文字の位置を特定します。その位置が 5 の場合、列がYYYY-MM-DD形式であることがわかり、適切な日付マスクを使用できます。位置が 5 でない場合、columnB はMM/DD/YYYYにあることがわかりますフォーマット。最後に、タイプが 1 でない場合、日付マスクはMMDDYYYYであることがわかります。

于 2013-05-07T23:15:31.770 に答える