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:数値または値のエラー:文字から数値への変換エラー」。
_'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;
_
問題は、日付ではなく文字列として解釈されるテキスト文字列に対して_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;
_
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;