• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

tworzenie relacji SQL sprawdzającej poprawność PESEL

VPS Starter Arubacloud
0 głosów
3,849 wizyt
pytanie zadane 21 stycznia 2018 w SQL, bazy danych przez Mlorism Użytkownik (580 p.)
Hej,

stanęło przede mną zadanie o następującej treści:
Utwórz relację OSOBY o następującej strukturze:
a. PESEL łańcuch znakowy 11-znakowy (stała dł.)
b. IMIE łańcuch znakowy 15-znakowy (zmienna dł.)
c. NAZWISKO łańcuch znakowy 15-znakowy (zmienna dł.)
d. DATA_URODZENIA data
Ponadto, podczas tworzenia nowej relacji zdefiniuj następujące ograniczenia integralnościowe:
e. PESEL musi liczyć dokładnie 11 znaków
f. pierwsze dwie cyfry numeru PESEL muszą być takie same, jak ostatnie dwie cyfry roku w atrybucie DATA_URODZENIA
g. kolejne dwie cyfry numery PESEL muszą być takie same, jak numer miesiąca w atrybucie DATA_URODZENIA
h. kolejne dwie cyfry numeru PESEL muszą być takie same, jak numer dnia w atrybucie DATA_URODZENIA
i. atrybut PESEL jest kluczem głównym relacji
j. atrybuty IMIĘ i NAZWISKO muszą być wypełnione (niepuste)
 

Napisałem kod, ale niestety moje podejście do sprawdzania poszczególnych fragmentów PESELU niestety otrzymuję komunikat "ERROR:  function left(date, integer) does not exist". Jak rozwiązać ten problem w poniższym kodzie? :)

create table OSOBY (
    PESEL char(11)  primary key,
    IMIE varchar(15) not null,
    NAZWISKO varchar(15) not null,
    DATA_URODZENIA date,
    constraint ZLA_DLUGOSC_PESEL check (lenght(PESEL) = 11),
    constraint ZLY_ROK_PESEL check (left(PESEL, 2) = right((left(DATA_URODZENIA ,4),2)),
    constraint ZLY_MIESIAC_PESEL check (right(left(PESEL, 4),2) = right(left(DATA_URODZENIA, 7), 2)),
    constraint ZLY_DZIEN_PESEL check (right (left(PESEL, 6),2) = right(left(DATA_URODZENIA, 10), 2))
);
komentarz 22 stycznia 2018 przez Bartess Gaduła (3,630 p.)
Drobna uwaga co do 3. i 4. cyfry PESEL - dla osób ur. po roku 1999 do numeru miesiąca należy dodać 20, dla osób urodzonych urodzonych przed 1900 rokiem należy dodać  80.

1 odpowiedź

0 głosów
odpowiedź 27 stycznia 2018 przez Mateusz Karmowski Nowicjusz (140 p.)
Left i right przyjmuje jako pierwszy argument tylko stringi. Na przykładzie tylko LEFT:

CAST(LEFT(CAST(DATA_URODZENIA AS VARCHAR(100)), 10) AS Date) będzie działać, w ten sposób rzutujesz datę do stringa, wyciągacz leftem co trzeba i rzutujesz z powrotem do daty.

 

I odpowiednio dla zagnieżdzonych left i right, choć tu lepiej byłoby użyć SUBSTRING:

right((left(DATA_URODZENIA ,4),2)), zamienić na:

CAST(SUBSTRING(CAST(DATA_URODZENIA AS VARCHAR(100)), 6, 2) AS DATE)

Podobne pytania

0 głosów
2 odpowiedzi 4,047 wizyt
0 głosów
1 odpowiedź 414 wizyt
pytanie zadane 22 lutego 2023 w C i C++ przez alfutek Początkujący (360 p.)
+1 głos
2 odpowiedzi 3,572 wizyt
pytanie zadane 29 stycznia 2021 w JavaScript przez void6 Użytkownik (790 p.)

92,775 zapytań

141,703 odpowiedzi

320,566 komentarzy

62,109 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...