web-dev-qa-db-ja.com

PL / SQLの日付またはto_charの質問

     begin
     if TO_CHAR('23-OCT-1994','DAY') = 'FRIDAY' THEN 
        DBMS_OUTPUT.PUT_LINE('FRIDAY');
     else
        DBMS_OUTPUT.PUT_LINE('Not Friday');
     end if;
     end;
     /

1994年10月23日が金曜日かどうかを確認しようとしています。金曜日ならFRIを返し、そうでなければFRIを返します。

しかし私は得る
「PL/SQL:数値または値のエラー:文字から数値への変換エラー」。

1
veritas

_'23-OCT-1994'_はDATEではなく文字列であるため、文字の_TO_CHAR_は無意味です。

まず、文字列をDATE値に変換する必要があります。日付形式と使用する言語を指定する必要があります。

_TO_DATE('23-OCT-1994', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American')
_

次に、平日と比較できます。注:_'DAY'_は、曜日を返しますが、最も長い名前までスペースが埋め込まれます。 '"'||TO_CHAR(DATE '2018-10-23', 'DAY')||'"'を試して、効果を確認してください。言語も指定する必要があります。

次のいずれかを使用できます。

  • TRIM(TO_CHAR(..., 'DAY', 'NLS_DATE_LANGUAGE = American')) = 'FRIDAY'
  • TO_CHAR(..., 'fmDAY', 'NLS_DATE_LANGUAGE = American') = 'FRIDAY'
  • TO_CHAR(..., 'DY', 'NLS_DATE_LANGUAGE = American') = 'FRI'

例えば

_begin
   if TO_CHAR(TO_DATE('23-OCT-1994', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American'),'fmDAY', 'NLS_DATE_LANGUAGE = American') = 'FRIDAY' THEN 
      DBMS_OUTPUT.PUT_LINE('FRIDAY');
   else
      DBMS_OUTPUT.PUT_LINE('Not Friday');
   end if;
end;
_
1

問題は、日付ではなく文字列として解釈されるテキスト文字列に対して_TO_CHAR_関数を使用することです。これは同じエラーをスローします:

_SELECT TO_CHAR('23-OCT-1994','DAY') FROM dual;
_

代わりに、_TO_DATE_を使用して文字列を日付に変換する必要があり、その出力で_TO_CHAR_を使用できます。

_SELECT TO_CHAR(TO_DATE('23-OCT-1994', 'DD-MON-YYYY'),'DAY') FROM dual;
_

IFステートメントをDBMS_OUTPUT.PUT_LINE()で実行するのではなく、SELECT構文を使用した単純なCASEステートメントでこれを行うことができます。

_SELECT CASE
          WHEN TO_CHAR(TO_DATE('23-OCT-1994', 'DD-MON-YYYY'),'DAY') = 'FRIDAY' 
               THEN 'Friday'
          ELSE 'Not Friday'
        END
FROM dual;
_
0
AMtwo

TO_CHAR(DATE DATATYPE、 'DAY')----> DAYのDATE DATATYPEを返します

TO_CHAR関数は、DATEデータ型からDAYを抽出できます。最初のパラメータとしてSTRINGを渡しているので、それはそれを理解していません。

ここでは、デコードを使用して同じです。あなたはケースや匿名ブロックでうまくやることができます。

select decode( to_char(to_date('23-OCT-1994', 'dd-MON-yyyy','NLS_DATE_LANGUAGE = American'), 'DAY')
                , 'FRIDAY'
                , 'Yes Friday'
                , 'No Friday')
          from dual;
0
Sameer Pradhan