2011-01-20 83 views
0

我一直在尋找這個工作很長時間沒有工作的原因。我連接兩個字段並嘗試運行一些日期比較,但它會引發錯誤ORA-01843:不是有效的月份。我不確定我在這裏做錯了什麼。Oracle SQL to_date函數不能在連接字符串上工作

這裏是我的代碼:

SELECT 
    sm.semester_date || cp.start_year AS effective 
FROM 
    database.table cp, 
    database.table2 sm 
WHERE cp.semesters_id = sm.semesters_id 
AND to_date(sm.semester_date || cp.start_year, 'MM/DD/YYYY') >= to_date('06/01/2011', 'MM/DD/YYYY') 

它運行很好,只要我不添加AND語句結尾。但我需要過濾數據集。

當你沒有過濾器運行它,它會返回2010年8月15日等

我忘了當初加入面膜的時候我張貼了這個,我已經糾正了。但是,它仍然返回這個錯誤ORA-01840:輸入值不夠長的日期格式。首先,感謝大家對我的幫助,你們都很棒。其次,我的錯誤是由沒有開始年份的課程引起的。非常令人沮喪,因爲這不應該發生。因爲連接的項目沒有年份,它會拋出錯誤。我只是找到了這個,因爲你們幫我修復了我的代碼。謝謝。

+0

什麼是「sm.semester_date || cp.start_year」返回?你確定它是'MM/DD/YYYY'格式嗎? – dimitrisli 2011-01-20 15:54:07

回答

1

我的猜測是您的默認日期格式與您傳遞給TO_DATE的字符串格式不匹配。將一個格式字符串作爲第二個參數添加到調用中(就像您爲第二次調用所做的那樣),以指定連接字符串的格式。

3

嘗試加入日期和年份之間的分隔符:

SELECT 
    sm.semester_date || '/' || cp.start_year AS effective 
FROM 
    database.table cp, 
    database.table2 sm 
WHERE cp.semesters_id = sm.semesters_id 
AND to_date(sm.semester_date || '/' || cp.start_year) >= to_date('06/01/2011', 'MM/DD/YYYY') 

如果沒有過濾器運行查詢,這是什麼回報?

+0

毆打28秒! – 2011-01-20 15:55:56

1

SEMESTER_DATE列的一個VARCHAR2?如果是這樣,它是'MM/DD /'格式的字符串嗎?或者只是'MM/DD'?

正如lweller指出的那樣,如果您的會話的NLS_DATE_FORMAT是'MM/DD/YYYY'以外的任何東西,第一個TO_DATE也會丟失格式掩碼,這將是一個問題。

假設SEMESTER_DATE格式爲 'MM/DD' 一個VARCHAR2,我懷疑你想

AND to_date(sm.semester_date || '/' || cp.start_year, 'MM/DD/YYYY') >= 
     to_date('06/01/2011', 'MM/DD/YYYY') 
0

你的第一個TO_DATE()在系統的默認格式依賴。用適當的格式字符串提供第二個參數,如'MM/DD/YYYY'。請比較:

SELECT SEMESTER_DATE || START_YEAR AS BARE_STRING, TO_DATE(SEMESTER_DATE || START_YEAR) AS CASTED_TO_DATE 
FROM (
    SELECT '12/31' AS SEMESTER_DATE, 2010 AS START_YEAR 
    FROM DUAL 
); 

SELECT SEMESTER_DATE || START_YEAR AS BARE_STRING, TO_DATE(SEMESTER_DATE || START_YEAR, 'MM/DD/YYYY') AS CASTED_TO_DATE 
FROM (
    SELECT '12/31' AS SEMESTER_DATE, 2010 AS START_YEAR 
    FROM DUAL 
);