1

Oracle 10 SQL に関する初級レベルの小さな質問です。「00:00」のような値を保持するはずの「日付」タイプの列を持つテーブルを作成しています。時間を 00:00 から 23:00 の間にチェックするという制約があります。

さて、私がよく理解できないのは、問題にどのようにアプローチするかです。かなり基本的なものが欠けているように感じますが、何が原因かわかりません...

私は:

1)制約内の日付を抽出して確認しますか? もしそうなら、それを行う方法はありますか?TO_DATE('13-AUG-66 12:56','DD-MON-YY HH:MI') のようなデータを挿入し、制約内である種の「抽出」関数を使用できますか?

2)問題の演習では、その特定の列の日付タイプについて言及しています。デフォルトでは、時間は保持されず、alter_session を使用して変更する必要があると思いますか?

4

2 に答える 2

2

制約は制限を強制するだけです。データを変更することはできません。トリガーはデータを変更できますが、一般BEFORE INSERTに制約よりも効率が低くなります。

時間コンポーネントが常に午前 0 時になるように制約を作成する場合

CREATE TABLE table_name (
  col DATE CHECK( col1 = TRUNC( col ))
);

データを変更するトリガーを作成する場合

CREATE OR REPLACE TRIGGER trg_trunc_dt
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.date_column := TRUNC( :new.date_column );
END;

DATEには、常に日付と時刻のコンポーネントが含まれます。クライアントには、どちらのコンポーネントも表示される場合と表示されない場合があります。多くのクライアントは、暗黙的なデータ型変換を使用します。この場合、 aを a に変換する方法と、どの要素を文字列に組み込むかをセッションがNLS_DATE_FORMAT制御します。DATEVARCHAR2

于 2013-10-24T04:16:48.870 に答える
0

日付型には、常に日付部分と時刻部分があります。これは単なる値であるため、フォーマットはありません。たとえば、時刻を 22:50 または 10:50pm と表示するかどうかはあなた次第です。to_char(mydate) で設定に依存するか、to_char(mydate,'hh24:mi') の形式を指定します。

これは、単に列の時刻部分を使用し、日付部分を無視できるということです。保存されている異なる日付についての混乱を避けたい場合は、たとえば、日付部分を 01.01.0001 に設定するトリガーを使用できます。

create or replace Trigger trg_datetable_datepart
before insert or update of mydate on datetable
for each row
begin
  :new.mydate := to_date( '01.01.0001 ' || to_char(:new.mydate, 'hh24:mi') , 'dd.mm.yyyy hh24:mi' );
end;

23 時間後の時刻の挿入を避けるには、チェック制約を記述します。

alter table datetable add constraint check_datetable_timepart check ( to_char(mydate, 'hh24:mi') <= '23:00' );
于 2013-10-24T06:14:25.457 に答える