2012-10-28 91 views
2

我有我的SQL查詢問題。ORA-01843:不是有效的月份

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和返回日期來解決這種情況? 這裏是我試圖上傳

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" 

我我在這裏觀察不同的時間格式。

任何人都可以建議我一個解決方案嗎?

在此先感謝。

+0

請參考此鏈接瞭解我如何使用時間戳數據類型 http://www.techonthenet.com/oracle/functions/to_timestamp.php – Nina

+0

您是否確實需要將這些字段聲明爲時間戳? –

+2

這裏使用了兩種不同的日期格式。另外,考慮使用'to_date'而不是'to_char',以便比較日期而不是字符串。 –

回答

2

在您的檢查約束條件中,指定日期格式掩碼爲'YYYY/MM/DD HH:MI:SS AM'的TO_CHAR()。但是您爲範圍指定的值有兩種不同的格式,例如

'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') 

但是,這可能不是你的問題的根源。這可能是加載過程中的轉換,這就是爲什麼我們需要知道如何加載數據。

+0

嗨。當我在to_date('2005/01/01 00:00:01 AM','YYYY/MM/DD HH:MI:SS AM')和 之間約束rental_rental_date check(rental_date) TO_DATE( '2015年12月31日下午11:59:59', 'YYYY/MM/DD HH:MI:SS AM') <---> 我得到錯誤, ORA-00920:無效的關係運算符 ..但我以這種方式嘗試, - > 約束rental_rental_date檢查(rental_date to_date('2005/01/01 00:00:01 AM','YYYY/MM/DD HH:MI:SS AM' )和 to_date('2015/12/31 11:59:59 PM','YYYY/MM/DD HH:MI:SS AM')) 我得到一個e rror, ORA-01849:小時必須介於1到12之間 – Nina

+0

我在創建表後使用sql loader上傳這個數據文件。 – Nina

+0

你能提出任何其他解決方案嗎?你能看我的數據併爲我寫一個查詢來創建一個表。只需指定我需要用於出租日期和返回日期的數據類型的類型。並確保您指定的條件,這兩個日期應該在2005年和2015年之間-------這是我的數據文件 [鏈接](http://www.mediafire.com/view/?p2d0csznzidw2iy) – Nina

相關問題