Ограничава използването на ДАТА

Опитвам се да създам ограничение, за да проверя, че записът не е по-голям от 2016 г.

Ето записа в моята база данни

въведете описание на изображението тук

Ето моето запитване:

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

Но получих грешка, която гласи: ГРЕШКА на ред 1:

ORA-02436: дата или системна променлива неправилно посочени в ограничението CHECK.

Проверих някои подобни въпроси на този уебсайт, но там решенията не решават проблема ми.


person Sean Li    schedule 11.10.2016    source източник
comment
meta.stackoverflow.com/questions/285551/   -  person a_horse_with_no_name    schedule 11.10.2016


Отговори (2)


Една от възможностите е да използвате функцията extract(), тъй като просто искате да проверите за годината:

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

или използвайте ANSI литерал за дата:

ALTER TABLE SIGHTINGS 
   ADD CONSTRAINT CK_SIGHTING_DATE 
   CHECK (SIGHTING_DATE < date '2016-01-01');
person a_horse_with_no_name    schedule 11.10.2016
comment
Опитах и ​​двете опции, но получавам тази грешка: ORA-02293: не може да се потвърди (S4369490.CK_SIGHTING_DATE) - ограничението за проверка е нарушено. - person Sean Li; 12.10.2016
comment
@SeanLi: тогава очевидно вмъквате редове, които нарушават това правило (напр. дата, която е през 2016 г.) - person a_horse_with_no_name; 12.10.2016
comment
Искате да кажете, че вече има някои съществуващи записи, които нарушават това правило? - person Sean Li; 13.10.2016

имате марка в спецификацията на датата

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'));

or

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

друго нещо е какво имате предвид, когато казвате „не по-голямо от 2016 г.“ Вашата проверка е датирала от 01 януари 2016 г., но не позволява 02 януари 2016 г. Ако искате да включите цялата 2016 година пишете

SIGHTING_DATE < DATE'2017-01-01'

или trunc(SIGHTING_DATE,'yy') ‹=DATE'2016-01-01'

person Michael Piankov    schedule 11.10.2016
comment
'01-JAN-16','DD-MON-YY' зависи от местния NLS_DATE_LANGUAGE, може да се провали за други езици освен английски. Също така двуцифрената година 16 не е много умна. - person Wernfried Domscheit; 11.10.2016
comment
Как зависи? Пиша символен низ и определям формат. През целия век от 2000 до 2099 г. ще върне датата 01 януари 2016 г. - person Michael Piankov; 11.10.2016
comment
Когато изпробвам първото ви предложение, получавам същата грешка: ORA-02436: дата или системна променлива неправилно посочени в ограничението CHECK - person Wernfried Domscheit; 11.10.2016