2017-06-02 4 views
0

stored procedureを作成するときに、日付のこれらの変数をチェックしてif statementの変数に変換しようとすると、変数のチェックに問題があります。これは、sysdateのストアドプロシージャと同じ宣言セクションのパラメータですか?

コードこの

create or replace procedure test 
as 
    dan nvarchar2(2) :='1'; 
    mesec nvarchar2(2) := '1'; 
    godina nvarchar2(4) := '2016'; 
begin 
    if to_date(dan||mesec||godina,'dd-mon-yy') != sysdate 
    then 
    for dan in 1..12 loop 
     dbms_output.put_line(dan); 
    end loop; 
    end if; 
end; 

のようにこれらの3つの変数は、パラメータとしてTO_DATE関数によって必要とされるもの、NVARCHAR2です。しかし、時に次のエラーに、私はそれを修正する方法がわからない

ORA-01861: literal does not match format string 

を与え、これまでにこれらの変数を変換しよう、とsysdateにそれが等しいチェック!ここで

+1

のように見えるのでしょうか? 「yyyymmdd」? –

+1

sysdateを変数と同じ形式の文字列に変換できますか? – MarkD

+0

使用しているフォーマット文字列は、曜日と月の2桁( '01と01')を必要とします。さらに、 'sysdate'はdateとtime **を返しますので、あなたの' IF'条件はあなたが思うように動作しないかもしれません。 –

答えて

1

ので、私は答えに入れてかなり長いコメントになるだろう。

ここから始めましょう。なぜあなたは持っていなかったこと

ORA-01861:リテラルの最初の場所でのフォーマット文字列

と一致していません。

が最終表す日付、文字列リテラル日付の異なる部分を連結した後to_date()機能で使用されるこの

112016 

日付フォーマット文字列(dd-mon-yy)のように見えていたあなたは、日と月がで表されることを期待し2桁の数字:日01と月011とです。 to_date()機能が正常に実行されることが、この

to_date('01012016', 'dd-mm-yy') 

のように見てきたはずですので

to_date('112016', 'dd-mm-yy') 

は、その後、あなたが考慮した日付の時刻の部分を取る必要があります。この(あなたのケースを)好きではありませんこれらの2つの日付を比較するときは、TRUNC()の機能をsysdateに適用することでそれを取り除く必要があります(それ以降、デフォルトは深夜です。ちょうど2つの日付を比較する場合に必要なものです)。

あなたは別の道を行くと、文字列にsysdateを変換し、あなたも(それぞれ0101)2桁の日と月との作業のいずれかを必要とする2つの文字列リテラルを比較したい場合は条件が

to_date('01012016', 'dd-mm-yyyy') != trunc(sysdate) 

なりますか(それぞれ1桁で表される)ままにして、フォーマット文字列にFM形式修飾子を使用して先行ゼロを取り除きます。だから、右の変換を使用することについてのいずれかの方法この

declare 
    dan nvarchar2(2) :='01'; 
    mesec nvarchar2(2) := '01'; 
    godina nvarchar2(4) := '2016'; 
begin 
    if godina||mesec||dan != to_char(sysdate, 'yyyymmdd'); 
    ... 
end; 

OR

declare 
    dan nvarchar2(2) :='1'; 
    mesec nvarchar2(2) := '1'; 
    godina nvarchar2(4) := '2016'; 
begin 
    if godina||mesec||dan != to_char(sysdate, 'fmyyyymmdd'); 
    ... 
end; 
+0

この明確化は私に多くを説明します。私は 'to_date(dan || mesec || godina、 'dd-mon-yy')!= sysdate'を試してみるようにすることは可能ですか?パラメータを日付に変換しようとしています。それは良い方法ですか? – Smederevac

+1

@Smederevacはい、可能です。答えには例があります。 –

+0

はい、あなたは正しいです。 – Smederevac

0

正しい方法:

create or replace procedure test 
as 
    dan nvarchar2(2) :='1'; 
    mesec nvarchar2(2) := '1'; 
    godina nvarchar2(4) := '2016'; 
begin 
    if godina||mesec||dan != to_char(sysdate,'yyyymmdd') 
    then 
    for dan in 1..12 loop 
     dbms_output.put_line(dan); 
    end loop; 
    end if; 
end; 
+0

をもう一度持っています。あなたは日と月の2桁の数字で作業するか、 'FM'形式の修飾子を使って日と月の先行ゼロを取り除く必要があります。そうでなければ、あなたのIF条件は常に真と評価されます。この場合、 '2016111'を(今日は01.01.2016、' sysdate'はこの日付を返します) '20160101'と比較しています。これは決して等しくありません。 –

+0

@NicholasKrasnovどのようにその障害を克服するには?宣言セクションの変数を '01'にするとどうなりますか? – Smederevac

+0

文字列なので、そうです。あるいは、 'lpad(mesec、2、 '0')'を使って左にゼロを置く。数字の場合は 'to_char(mesec、'00 ')'を使うことができます。 –

関連する問題