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

SELECTステートメントでto_date例外を処理して、それらの行を無視するにはどうすればよいですか?

    Tonyのコメントを反映して、フロントエンドのクエリツールにこれらの例外を見つけて処理させるよりも、DATE列に日付を保存する方がはるかに良いでしょう。

    ただし、間違ったデータモデルで立ち往生している場合、以前のバージョンで最も簡単なオプションは、変換を実行してエラーを処理する関数を作成することです。

    CREATE OR REPLACE FUNCTION my_to_date( p_date_str IN VARCHAR2,
                                  p_format_mask IN VARCHAR2 )
      RETURN DATE
    IS
      l_date DATE;
    BEGIN
      l_date := to_date( p_date_str, p_format_mask );
      RETURN l_date;
    EXCEPTION
      WHEN others THEN
        RETURN null;
    END my_to_date;
    

    クエリは次のようになります

    SELECT * 
      FROM myTable
     WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
    

    もちろん、MY_TO_DATEに関数ベースのインデックスが必要になる可能性があります。 このクエリを適度に効率的にするために呼び出します。

    12.2では、Oracleはto_dateに拡張機能を追加しました。 およびcast エラーのある変換を処理する関数

    SELECT * 
      FROM myTable
     WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
    

    validate_conversionを使用することもできます 有効な日付である(またはそうでない)すべての行を検索する場合に機能します。

    SELECT *
      FROM myTable 
     WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1 
    


    1. SQLiteで毎月第1月曜日を返す

    2. テーブルがSQLServer(T-SQL)でパーティション化されているかどうかを確認する

    3. SQLDROPTABLEステートメントとさまざまなユースケース

    4. java.sql.SQLException:使い果たされた結果セット