DATE

2016-10-11 1 views
0
Contraint à l'aide

Je suis en train de créer une contrainte pour vérifier le dossier est pas supérieur à 2016.DATE

Voici l'enregistrement dans ma base de données

enter image description here

Voici ma question:

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE <=TO_DATE('01-JAN-16')); 

Mais je suis une erreur dit: erreur à la ligne 1:

ORA-02436: date or system variable wrongly specified in CHECK constraint.

J'ai vérifié quelques questions similaires sur ce site Web mais les solutions ne résout pas mon problème.

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

Répondre

3

Une option consiste à utiliser la fonction extract() comme vous voulez simplement vérifier pour l'année:

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (extract(year from SIGHTING_DATE) < 2016); 

ou utiliser une date ANSI littérale:

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE < date '2016-01-01'); 
+0

J'ai essayé les deux options, mais j'obtiens cette erreur: ORA-02293: impossible de valider (S4369490.CK_SIGHTING_DATE) - vérifier que la contrainte a été violée. –

+0

@SeanLi: alors apparemment vous insérez des lignes qui enfreignent cette règle (par exemple, une date qui est en 2016) –

+0

Voulez-vous dire qu'il y a déjà des enregistrements qui violent cette règle? –

0

vous faire Date Specifcation

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE <= 
       /*TO_DATE('01-JAN-16','DD-MON-YY') as I was pointed your should specify 4 digits for year*/ 
       TO_DATE('01-JAN-2016','DD-MON-YYYY')); 

ou

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE <=DATE'2016-01-01'); 

autre choses à sa qu'entendez-vous quand vous dites "non supérieure à 2016" Vos vérifier les dates de alow à 01- jan-2016 mais ne pas autoriser 02-jan-2016. Si vous souhaitez inclure toute écriture 2016 années

SIGHTING_DATE < DATE'2017-01-01' 

ou trunc (SIGHTING_DATE, 'yy') < = DATE'2016-01-01'

+2

'' 01-JAN-16 ',' DD-MON-YY'' dépend de NLS_DATE_LANGUAGE local, il peut échouer pour d'autres langues que l'anglais. Aussi l'année à deux chiffres '16' n'est pas très intelligente. –

+0

Comment ça dépend? J'écris une chaîne de caractères et spécifie un format. Dans tout le siècle de 2000 à 2099 il renverra la date 01 janvier 2016. –

+0

Quand j'essaye votre première proposition j'obtiens la même erreur: ** ORA-02436: date ou variable de système mal spécifiée dans la contrainte de CHECK ** –