1. ホーム
  2. oracle

[解決済み] エラーを取得する - ORA-01858: 数値が期待される場所で非数値文字が見つかりました。

2022-02-04 16:54:51

質問内容

以下のSQLでエラーが発生します。

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;

解決方法は?

このエラーは、以下のいずれかの方法で発生しています。 TO_DATE とは異なるフォーマットマスクを使用しています。 nls_date_format パラメータ[1]を使用するか、event_occurrence列に数値でないデータが含まれているためです。

a) 日付カラムに 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 という形式の日付に戻している可能性が高いです。文字列がこのフォーマットでないため、エラーが発生します。