sql >> Databasteknik >  >> RDS >> Oracle

kontrollera efter giltigt datum som deklareras i varchar2

Jag ska snarare fixa designproblemet som en permanent fix snarare än att slösa tid på lösningen.

För det första, ALDRIG butik DATE som VARCHAR2 . Allt detta omkostnader beror på att din design är felaktig .

'20100231'

Hur i hela friden kan det vara ett giltigt datum? Vilken kalender har 31 dagar i FEBRUARI?

Följ dessa steg:

  1. Lägg till en ny kolumn med DATE DATA TYPE.
  2. Uppdatera den nya kolumnen med datumvärden från den gamla kolumnen med TO_DATE .
  3. Gör den nödvändiga DATE-arithmetiken i den nya DATE-kolumnen, eller hantera detta i UPDATE-satsen i själva steg 2.
  4. Släpp den gamla kolumnen.
  5. Byt namn på den nya kolumnen till den gamla.

UPPDATERA Lägger till en demo

Inställningar

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>

Lägg till ny kolumn:

SQL> ALTER TABLE t ADD (dt DATE);

Table altered.

SQL>

GÖR den nödvändiga uppdateringen

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>

Låt oss kontrollera:

SQL> SELECT * FROM t;

YMD      DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101

SQL>

Släpp den gamla kolumnen:

SQL> ALTER TABLE t DROP COLUMN ymd;

Table altered.

SQL>

Byt namn på den nya kolumnen till gamla kolumnnamn

SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;

Table altered.

SQL>

Du har precis åtgärdat problemet

SQL> SELECT * FROM t;

YMD
---------
12-NOV-10
01-JAN-15


SQL>



  1. Bästa tillvägagångssätt för grupperade löpande summor

  2. Hur man uppgraderar MariaDB 5.5 till MariaDB 10.1 på CentOS/RHEL 7 och Debian Systems

  3. Sammanföra två tabeller med olika antal kolumner

  4. Returnera en lista över partitionsscheman i SQL Server (T-SQL)