2016-03-08 203 views
0

我改變OCI8版本PHP和由於此查詢不到風度工作:ORACLE - ORA-01843:不是有效的月份

SELECT 'M'||to_char(to_date(OD.DATE2,'DD/MM/YYYY'),'MM') PERIODE, count(*) DATA, OD.DCCPT DCCPT 
FROM BDD OD 
WHERE BDD = 'phone' 
AND OD.SENS = 'Ent' 
AND OD.DCCPT IN('PIOLUC') 
AND (OD.DATE2 BETWEEN '08/03/2015' AND '08/03/2016') 
group by 'M'||to_char(to_date(OD.DATE2,'DD/MM/YYYY'),'MM'), OD.CDCCPT CDCCPT 

我得到這個消息:

消息:oci_execute() :ORA-01843:不是有效月份

它適用於Toad for Oracle 11.您有任何解決方案嗎?

謝謝:)

+1

什麼是DATE2的數據類型? – Boneist

+2

如果'date2'是一個'date',那麼爲什麼使用'to_date()'將'date'轉換爲'date'值? –

+0

您在「GROUP BY」中有一個錯誤的別名,而您正在使用「CDCCPT」進行分組,但您選擇的列是「DCCPT」。你可能也想解決這些問題。 – MT0

回答

1

假設OD.DATE2是DATE數據類型的,你需要的日期,如弦(如'08/03/2015')顯式地轉換爲日期格式。

喜歡的東西:

SELECT 'M'||to_char(OD.DATE2,'MM') PERIODE, 
     count(*) DATA, 
     OD.DCCPT DCCPT 
FROM  BDD OD 
WHERE BDD = 'phone' 
AND  OD.SENS = 'Ent' 
AND  OD.DCCPT IN ('PIOLUC') 
AND  OD.DATE2 BETWEEN to_date('08/03/2015', 'dd/mm/yyyy') AND to_date('08/03/2016', 'dd/mm/yyyy') 
group by 'M'||to_char(OD.DATE2,'MM'), 
      OD.DCCPT; 

注意我是如何去除通過列表選擇和組to_date從各地OD.DATE2,因爲它是一個非常壞主意使用to_date反對的東西,已經是一個日期。

通過這樣做,您可以強制Oracle對字符串執行隱式轉換,它將通過使用NLS_DATE_FORMAT參數決定以何種格式輸出字符串,然後再嘗試將其轉換回使用格式日期面膜你指定的,就像這樣:

to_date(to_char(od.date2, '<nls_date_format parameter>'), 'DD/MM/YYYY') 

如果兩種格式的面具是不一樣的,你會遇到錯誤...如提示您發佈此問題的一個!

+0

工作就像一個魅力,我應該看到它..謝謝! –

1

縱觀行:

OD.DATE2 BETWEEN '08/03/2015' AND '08/03/2016' 

然後'08/03/2015''08/03/2016'是字符串和不日期。

Oracle會嘗試使用您的NLS_DATE_FORMAT會話參數作爲格式掩碼,從字符串文字到日期的隱式轉換,如果這不起作用,則會引發錯誤。

簡單的解決方法是不使用字符串文字,但使用日期文字來代替:

SELECT 'M'||to_char(DATE2, 'MM') PERIODE, 
     count(*) DATA, 
     DCCPT 
FROM BDD 
WHERE BDD = 'phone' 
AND  SENS = 'Ent' 
AND  DCCPT IN ('PIOLUC') 
AND  DATE2 BETWEEN DATE '2015-03-08' AND DATE '2016-03-08' 
GROUP BY 
     'M'||to_char(DATE2, 'MM'), 
     DCCPT 

但你也可以指定格式掩碼:

OD.DATE2 BETWEEN TO_DATE('08/03/2015', 'DD/MM/YYYY') AND TO_DATE('08/03/2016', 'DD/MM/YYYY') 
相關問題