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

varchar2で宣言されている有効な日付を確認してください

    むしろ設計上の問題を修正します 回避策に時間を浪費するのではなく、恒久的な修正として。

    まず、決して 日付を保存する VARCHAR2として 。このオーバーヘッドはすべて、設計に欠陥があるという事実によるものです。 。

    '20100231'

    いったいどうしてそれが有効な日付になるのでしょうか? 2月に31日あるカレンダーはどれですか?

    次の手順に従ってください:

    1. DATEDATATYPEで新しい列を追加します。
    2. TO_DATE を使用して、古い列の日付値で新しい列を更新します 。
    3. 新しいDATE列で必要なDATE演算を実行するか、ステップ2自体のUPDATEステートメントでこれを処理します。
    4. 古い列を削除します。
    5. 新しい列の名前を古い列に変更します。

    更新 デモの追加

    セットアップ

    SQL> CREATE TABLE t
      2      (ymd varchar2(8));
    
    Table created.
    
    SQL>
    SQL> INSERT ALL
      2      INTO t (ymd)
      3           VALUES ('20101112')
      4      --INTO t (ymd)
      5      --     VALUES ('20100231')
      6      INTO t (ymd)
      7           VALUES ('20150101')
      8      INTO t (ymd)
      9           VALUES ('20160101')
     10  SELECT * FROM dual;
    
    3 rows created.
    
    SQL>
    SQL> COMMIT;
    
    Commit complete.
    
    SQL>
    

    新しい列を追加する:

    SQL> ALTER TABLE t ADD (dt DATE);
    
    Table altered.
    
    SQL>
    

    必要な更新を行う

    SQL> UPDATE t
      2  SET dt =
      3    CASE
      4      WHEN to_date(ymd, 'YYYYMMDD') > SYSDATE
      5      THEN NULL
      6      ELSE to_date(ymd, 'YYYYMMDD')
      7    END;
    
    3 rows updated.
    
    SQL>
    SQL> COMMIT;
    
    Commit complete.
    
    SQL>
    

    確認しましょう:

    SQL> SELECT * FROM t;
    
    YMD      DT
    -------- ---------
    20101112 12-NOV-10
    20150101 01-JAN-15
    20160101
    
    SQL>
    

    古い列を削除します:

    SQL> ALTER TABLE t DROP COLUMN ymd;
    
    Table altered.
    
    SQL>
    

    新しい列の名前を古い列名に変更します

    SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
    
    Table altered.
    
    SQL>
    

    問題を修正しました

    SQL> SELECT * FROM t;
    
    YMD
    ---------
    12-NOV-10
    01-JAN-15
    
    
    SQL>
    



    1. CONNECTBYまたはOracle以外のRDBMSの階層クエリ

    2. WHERE句は、INとJOINの前または後に実行する方が適切です

    3. SQL ServerデータベースをMySQLにエクスポートする方法は?

    4. 特定のデータベースに対して最後に実行されたクエリ