2

SQL クエリに問題があります。

  create table rental
  (     
  rental_id NUMBER(5) NOT NULL,
  rental_date timestamp NOT NULL, 
  inventory_id NUMBER(5) NOT NULL,
  customer_id NUMBER(5) NOT NULL,
  return_date timestamp NOT NULL,
  staff_id NUMBER(5) NOT NULL,
  constraint rental_primary PRIMARY KEY (rental_id),
  constraint rental_foreign FOREIGN KEY (inventory_id) REFERENCES 

  inventory(inventory_id),
  constraint rental_foreign2 FOREIGN KEY (customer_id) REFERENCES
  customer(customer_id),
  constraint rental_foreign3 FOREIGN KEY (staff_id) REFERENCES staff(staff_id),
  constraint rental_unique_rental_date unique (rental_date),
  constraint rental_unique_inventory_id unique (inventory_id),
  constraint rental_unique_customer_id unique (customer_id),
  constraint rental_rental_date check(to_char(rental_date,'YYYY/MM/DD HH:MI:SS AM') 
  between '2005/01/01 00:00:01 AM' AND '12/31/2015 11:59:59 PM'),
  constraint rental_return_date check(to_char(return_date,'YYYY/MM/DD HH:MI:SS AM') 
  between '2005/01/01 00:00:01 AM' AND '12/31/2015 11:59:59 PM')
  );

データを挿入しようとすると、「ORA-01843: 有効な月ではありません」というエラーがスローされます。この状況を乗り切るために、rental_date と return date にどのタイプのデータ型を使用できるか教えてください。ここにアップロードしようとしているサンプルデータがあります

    rental_date                   return_date
   5/24/2011  10:53:30 PM        5/26/2011  10:04:30 PM

注:データがあるExcelシートでこのタイプの形式を見ることができますが、エラーが発生した場合

       "ORA-01843: not a valid month    
     Row 145: 144,  2011-05-25 23:49:56  ,1689,357,  2011-06-01 21:41:56  ,2"

私はここで異なる形式の時間を観察しています。

誰かが私に解決策を提案できますか?

前もって感謝します。

4

1 に答える 1

2

チェック制約で、TO_CHAR() を日付形式マスク で指定します'YYYY/MM/DD HH:MI:SS AM'。ただし、範囲に指定する値は 2 つの異なる形式です。

'2005/01/01 00:00:01 AM' AND '12/31/2015 11:59:59 PM'

文字列はあなたが思っているように比較されないため、代わりに日付を使用することをお勧めします。

constraint rental_rental_date check(rental_date) 
    between to_date('2005/01/01 00:00:01 AM', 'YYYY/MM/DD HH:MI:SS AM') and
            to_date('2015/12/31 11:59:59 PM', 'YYYY/MM/DD HH:MI:SS AM')

ただし、これが問題の原因ではない場合があります。読み込みプロセスでの変換である可能性があるため、データの読み込み方法を知る必要があります。

于 2012-10-28T11:36:05.667 に答える