2015-08-28 63 views
1

我在Oracle DB中有一列,它是varchar2數據類型。存儲在此列中的典型值與06/16/2015 02:14:18 AM相似。 我想2015年八月ORA-01843:不是有效的月份錯誤

select * 
from MYTABLE 
where to_date(substr(MYCOLUMN,1,10),'dd-mm-yyyy') > to_date('01-08-2015','dd-mm-yyyy'); 

1日以後獲得,其中此列有記錄的所有記錄但是,我越來越ORA-01843。我在哪裏做錯了?

+2

列中的格式:'06/16/2015 02:14:18 AM'與您在該列的'to_date()'調用中使用的格式掩碼'dd-mm-yyyy'不匹配。你想'mm/dd/yyyy'而不是 –

+0

你的模式是錯誤的:''dd-mm-yyyy''必須是'mm /'dd/yyyy'' – Jens

+0

爲什麼你把'DATE'作爲'VARCHAR2'存儲?使用適當的數據類型是數據庫設計和性能最重要的部分之一。 –

回答

3

尊重格式的VARCHAR

....where to_date(substr(MYCOLUMN,1,10),'mm/dd/yyyy') 
+0

謝謝。但是,如果我從MYTABLE中添加order by ..'select * to_date(substr(MYCOLUMN,1,10),'mm/dd/yyyy')> to_date('08/01/2015' ,'mm/dd/yyyy') order by SOMEOTHERCOLUMN desc;' – user2488578

0

如果您的表像06/16/2015 02:14:18 AM所有的值,那麼你可以使用trunc(to_date(MYCOLUMN,'mm/dd/yyyy HH:mi:SS PM'),'dd')to_date(substr(MYCOLUMN,1,10),'dd-mm-yyyy')

1

我在Oracle DB中有一列是varchar2數據類型。存儲在此列中的典型值類似於06/16/2015 02:14:18 AM。

第一個問題是,爲什麼你存儲DATE?使用適當的數據類型數據庫設計性能的最重要部分之一。

明白日期沒有格式你看,這是存儲在內部7 bytes這是Oracle專有的格式。不建議將日期存儲爲字符串以具有固定格式。

我會建議首先修復設計,以便您不必執行此開銷活動,而比較日期。從長遠來看它會幫助你。

1.添加一個新列作爲日期數據類型。

ALTER TABLE table_name 
    ADD new_column DATE;

2.更新新列。

UPDATE table_name 
    SET new_column = TO_DATE(old_column, 'mm/dd/yyyy hh:mi:ss pm');

3.刪除舊列。

ALTER TABLE table_name 
    DROP COLUMN old_column;

4.重命名新列老列名。現在

ALTER TABLE table_name 
    RENAME COLUMN old_name to new_name;

,你可以很容易地比較日期:

SELECT * FROM MYTABLE WHERE mycolumn > to_date('01-08-2015','dd-mm-yyyy'); 

這也將使用任何常規指數日期列上。

但從性能上來看:

如果你現在不解決這個問題,你會繼續面臨性能問題。由於SUBSTR的立即修復不會讓您使用任何常規索引,因此您需要創建基於功能的索引的

相關問題