3

transactionDateTimeトランザクション テーブルがあり、問題は列を追跡することです。SQL を使用すると、挿入されたデータが特定の日の午前 8 時から午後 10 時までの間にある必要があるようにフォーマットするDATEまたはを取得できないようです。TIMESTAMP

    CREATE TABLE Transaction_T
      (transactionID          NUMBER(8,0)              ,
       employeeID             NUMBER(10,0)      NOT NULL,
       customerID             NUMBER(6,0)       NOT NULL,
       transactionDate        VARCHAR2(9)       NOT NULL,
       transactionPayment     VARCHAR2(10) check(transactionPayment IN('cash','credit','debit','ebt')),
       transactionType        VARCHAR2(10) check(transactionType IN('void','return','sale')),
       transactionDateTime    TIMESTAMP check(transactionDateTime < '% 22:00:00' AND transactionDateTime > '% 08:00:00') NOT NULL,
CONSTRAINT TransactionPK PRIMARY KEY (transactionID),
CONSTRAINT TransactionFK1 FOREIGN KEY (employeeID) REFERENCES Employee_T(employeeID),
CONSTRAINT TranscationFK2 FOREIGN KEY (customerID) REFERENCES Customer_T(customerID));

上の表は作成されていますが、正しい を挿入しようとすると、Date(Time)1 から 12 までの時間に関するフォーマット エラーが表示されるか、時間が 12 未満の場合は有効な月ではありません。Oracle のドキュメント形式を使用しましたが、うまくいきません。

INSERT INTO 
transaction_T(transactionID, employeeID, customerID, transactionDate, transactionPayment, transactionType, transactionDateTime) 
VALUES(00000001, 0001, 000004, '04-APR-13','ebt','sale','04-APR-13 13:25:10');
4

2 に答える 2

8

チェック制約では、ここ%では機能しません。代わりにこれを試してください:

CHECK (
  EXTRACT(HOUR FROM transactionDateTime) < 22 AND
  EXTRACT(HOUR FROM transactionDateTime) >= 8)
于 2013-04-12T14:54:54.613 に答える
1

次のようにチェック制約を表現できます。

check(transactionDateTime between trunc(transactionDateTime) + 8/24 and trunc(transactionDateTime) + 22/24))
于 2013-04-12T14:54:09.203 に答える