次の Oracle の制約がわかりません。
ALTER TABLE TableName ADD (
CONSTRAINT CHK_DATE
CHECK (date_start = trunc(date_start, 'dd') and date_end = trunc(date_end, 'dd')));
常に ORA-02290 エラーがスローされます。誰かが私のためにこれを説明してくれませんか。
次の Oracle の制約がわかりません。
ALTER TABLE TableName ADD (
CONSTRAINT CHK_DATE
CHECK (date_start = trunc(date_start, 'dd') and date_end = trunc(date_end, 'dd')));
常に ORA-02290 エラーがスローされます。誰かが私のためにこれを説明してくれませんか。
date_start
との両方date_end
の時間値がある00:00:00
(つまり、時間コンポーネントがない) ことを確認します。
OracleのDATE
データ型は、ある時点 (秒単位まで正確) です。したがって、常に時間要素があります。
多くのアプリケーションでは、時間コンポーネントなしで 1 日を使用すると便利な場合があります。これは、1 日を使用すると計算が簡単になるためです。したがって、挿入されたすべての日付に時間コンポーネントが含まれないようにするために、列に制約を追加できます。
挿入または更新するには、時間のない形式 (または time=00:00:00 を含む) を使用します。
to_date('2013-01-01', 'yyyy-mm-dd')
または使用しますTRUNC
。
この制約は、フィールド DATE_START と DATE_END の両方が切り捨てられた日付でなければならない、つまり、時間、分、秒を指定してはならないことを示しています。したがって、次の INSERT が機能するはずです。
INSERT INTO TABLENAME (DATE_START, DATE_END)
VALUES (TRUNC(SYSDATE), TRUNC(SYSDATE)+INTERVAL '1' DAY)
次はそうしません:
INSERT INTO TABLENAME (DATE_START, DATE_END)
VALUES (SYSDATE, SYSDATE+INTERVAL '1' DAY)
共有してお楽しみください。
Oracle では、日付値を時間なしで格納する方法は提供されていません。時間の部分を常に真夜中に保つことができます。多くのユーザーがそうしています。ただし、何らかの理由で数分または数時間が列に忍び寄ると、おそらく誰も気付かないうちに日付演算が失敗する可能性があります。
あなたの制約は、日付と時刻の列date_start
とdate_end
値が期待どおりであり、時間コンポーネントを保存しないことを確認するだけです。
例:
SELECT t, CASE WHEN t=trunc(t,'DD') THEN 'check ok' ELSE 'check fails' END AS chk
FROM (select (DATE '2013-06-26' - INTERVAL '1' HOUR)+10*level*(1/24/60) as t from dual connect by level < 12);
25.06.2013 23:10:00 check fails
25.06.2013 23:20:00 check fails
25.06.2013 23:30:00 check fails
25.06.2013 23:40:00 check fails
25.06.2013 23:50:00 check fails
26.06.2013 00:00:00 check ok
26.06.2013 00:10:00 check fails
26.06.2013 00:20:00 check fails
26.06.2013 00:30:00 check fails
26.06.2013 00:40:00 check fails
26.06.2013 00:50:00 check fails