sql >> データベース >  >> RDS >> Oracle

SQL日付が無効な数値形式モデルパラメータに変換されます。

    根本原因:

    NUMBERを変換しています STRING 日付であると仮定します 。 20111010 は日付ではなく、数値です。また、'20111010' は日付ではなく、文字列です。それらは完全に異なります。

    • 20111010 -番号
    • '20111010' - STRING
    • TO_DATE('20111010','YYYYMMDD') -日付

    エラー:

    SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
    SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
                             *
    ERROR at line 1:
    ORA-01481: invalid number format model
    

    質問に答える:

    WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
      BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
    AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
    

    変換とフォーマットを不必要に複雑にしている。

    タイムスタンプ データ型は日付の拡張です データ・タイプ。 DATEデータ型のdatetime要素に加えて、TIMESTAMPデータ型は、小数点以下0桁から9桁までの精度で秒の小数部を保持します。デフォルトは6です。

    タイムスタンプを扱っているので TO_TIMESTAMPを使用できます 。

    DATE/TIMESTAMP演算を実行している間 、データ型はそのままにして、文字列に変換しないでください。 。 TO_CHARを使用する必要があります 表示のみ 。

    フィルタ述語を次のように変更します:

    WHERE CREATE_TIME 
    BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD') 
    AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
    

    上記、:fromDate および:toDate 文字列である必要があります 番号ではありません 。

    たとえば、

    SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
    
    TO_TIMESTAMP('20111010','YYYYMMDD')
    -----------------------------------------------------------
    10-OCT-11 12.00.00.000000000 AM
    

    または、 TO_CHARを使用します 最初に変換する 番号 文字列に :

    SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
    
    TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
    ------------------------------------------------------------------
    10-OCT-11 12.00.00.000000000 AM
    


    1. phpはmysqlテーブルの別々の行に複数の値を挿入します

    2. Hibernate:varcharを返すストアド関数を呼び出す方法は?

    3. サブスクライバーの投稿とユーザー自身の投稿を表示する

    4. ETLプロセスでのPythonとMySQLの使用:SQLAlchemy