2016-05-05 3 views
1

はテーブルSQLトリガ更新期間与えられた2つのタイムスタンプは、ここ

create table call(
id varchar(5), 
start_time timestamp, 
end_time timestamp, 
duration INTERVAL DAY(5) TO SECOND(3), 
primary key(id) 
); 

とトリガのとき:

create or replace TRIGGER DURATION 
BEFORE INSERT ON call 
for each row 
BEGIN 
select end_time - start_time into :new.duration from dual; 
END; 

挿入

insert into call values(111,'2015-04-21 15:42:23','2016-11-03 18:32:47',null); 

を行っているとき、それは次のように仕事ができるように、 end_timeが無効な識別子であることを示しています。私は、挿入する特定の行にend_timeを参照させるためにシーケンスや何かを必要とするかもしれないことに気付いていますが、そこに置くべきものはわかりません。

+0

この条件を発生させる値を含むinsert文の例を含めてください。 –

+0

また、どのデータベースですか?製品名とバージョンをご確認ください。 –

+0

ありがとう!投稿を編集しました。そしてそれはOracleのためです。 – RhumB

答えて

1

私は、タイムスタンプの計算のためにこの変更をしようとするだろう:

select :new.end_time - :new.start_time into :new.duration from dual; 

私はから来てend_timestart_time列を修飾することを疑う:新しい行が正しく、これを行うために必要な場合があります。

さらに1つの点は、INSERTステートメントに値に関連付けられた列名が含まれている必要があります。これは、このトリガーで特に計算されているため、 'duration'を省略することもできます。

が、この代わりに考えてみましょう:

insert into call (id, start_time, end_time) values(111,'2015-04-21 15:42:23','2016-11-03 18:32:47'); 

ハードレッスンが突然、以前働いていたINSERT文を破るスキーマの更新を行った後に学びました。さらに悪いことに、INSERTが実際に失敗することはありませんが、間違ったことを静かに実行します。

+0

ありがとう!今はうまくいきます。 – RhumB

関連する問題