0

文字列を日付に変換してフォーマットすることについて以前に質問し ました.ORACLE 11g SQLの文字位置に基づいて文字列を分割する

WKENDING が VARCHAR2 で RYEAR が日付の場合、私が思いついた解決策は次のとおりです。WKENDING には「523」(mmdd) のようなデータがあり、RYEAR は「2012」です。

UPDATE OB_SEL_LST84_AGG_WKEND  SET WKENDYEAR =  (TO_DATE((TO_DATE(substr(WKENDING,3,2)),'dd')||(TO_DATE(substr(WKENDING,0,1)),'mon')||(TO_DATE(TO_CHAR(RYEAR)),'yyyy')),'dd-mon-yyyy');

「ORA-00907: 右括弧がありません」というエラーが表示されます。括弧を数回再確認しましたが、正しいように見えます..どんな助けでも素晴らしいでしょう..ありがとう!

更新 - 上記の構文を調べた後、TO_DATE の変換試行が多すぎるのではないかと思いました。だから、私はそれをこれに短縮しました..

UPDATE OB_SEL_LST84_AGG_WKEND  SET WKENDYEAR =  (TO_DATE((substr(WKENDING,3,2))||(substr(WKENDING,0,1))||TO_CHAR(RYEAR)),'dd-mon-yyyy');

私はまだかっこの欠落エラーを取得しています.. ARGH!

4

1 に答える 1

1

wkendyear列のデータ型は であるため、DATE必要なのは

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )

もちろん、これはすべての文字列データを有効な日付に変換できることを前提としています。wkendingof0229ryearof 2013(または有効な日付ではないその他の文字列の組み合わせ) があるとすぐに、TO_DATE関数は例外をスローします。これが、日付をVARCHAR2列に格納することが一般的に問題となる理由の 1 つです。

すべてのデータを に正しく変換できない場合は、変換を試行し、例外がDATEある場合に を返す関数を作成できます。NULL例えば

CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2, p_format IN VARCHAR2 )
  RETURN DATE
IS
  l_dt DATE;
BEGIN
  l_dt := to_date( p_str, p_format );
  RETURN l_dt;
EXCEPTION
  WHEN others THEN
    RETURN NULL;
END;

あなたのUPDATE声明はその後になります

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = my_to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )

文字列を日付に変換できない行を探すこともできます

SELECT *
  FROM OB_SEL_LST84_AGG_WKEND  
 WHERE my_to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' ) IS NULL
   AND (wkending IS NOT NULL or ryear IS NOT NULL)
于 2012-06-27T17:56:26.567 に答える