2015-04-24 188 views
1

我收到錯誤在下面的SQL:得到錯誤 - ORA-01858:一個非數字字符被發現,其中一個數字預計

ORA-01858:一個非數字字符被發現在那裏數字預計

SELECT c.contract_num, 
     CASE 
      WHEN ( MAX (TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')) 
        - MIN (TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))) 
       /COUNT (c.event_occurrence) < 32 
      THEN 
       'Monthly' 
      WHEN  ( MAX (
          TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')) 
         - MIN (
          TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))) 
        /COUNT (c.event_occurrence) >= 32 
       AND ( MAX (
          TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')) 
         - MIN (
          TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))) 
        /COUNT (c.event_occurrence) < 91 
      THEN 
       'Quarterley' 
      ELSE 
       'Yearly' 
     END 
FROM  ps_ca_bp_events c 
GROUP BY c.contract_num; 
+0

什麼是您的event_dt列的數據類型?另外,你爲什麼將日期轉換爲字符串並減去它們?什麼目的?如果要查找兩個日期之間有多少天,請考慮如果最大日期是12月12日,最後日期是同年11月31日,可能會得到什麼結果。如果他們在不同的年份呢? – Boneist

+0

event_dt列是日期類型。 –

+4

如果它已經是日期,那你爲什麼要對它做'TO_DATE'? – Boneist

回答

9

你所得到的錯誤可能是因爲你是在一列,已經是一個日期做TO_DATE,而你使用格式掩碼是您nls_date_format參數[1不同]還是因爲event_occurrence列包含不是數字的數據。

你需要一個),所以,它不是使用日期列上TO_DATE糾正你的查詢,以及b)更正數據,如果event_occurrence應該是隻是數字。

並修復列的數據類型,以確保您只能存儲數量。



[1] 甲骨文做什麼,當你做:TO_DATE(date_column, non_default_format_mask)是: TO_DATE(TO_CHAR(date_column, nls_date_format), non_default_format_mask)

通常,默認nls_date_format參數設置爲dd-MON-yy,所以在您的查詢,什麼可能是發生的是你的日期列被轉換爲dd-MON-yy格式的字符串,然後你使用MMDD格式將其轉換回日期。字符串不是這種格式,所以你得到一個錯誤。

+0

Thanks @Boneist !!!! –

+0

我只是刪除了TO_DATE()函數和查詢工作正常......非常感謝你們及時回覆......我真的很感激你的男人! :) –

0

我加了TO_DATE它解決了問題。

修改之前 - 由於下面的病情,我得到這個錯誤

record_update_dt>='05-May-2017' 

修改後 - 加入to_date後,問題得到了解決。

record_update_dt>=to_date('05-May-2017','DD-Mon-YYYY') 
相關問題