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

Funcje, Trigger - sortowanie po dacie proszę o pomoc

Cloud VPS
0 głosów
814 wizyt
pytanie zadane 17 czerwca 2015 w SQL, bazy danych przez Cinas Nowicjusz (160 p.)
edycja 17 czerwca 2015 przez Cinas

Witam, robię bazę wypożyczalni samochodów.

Nazwa tabeli "wypozyczalnia", tabela ma w sobie następujące kolumny:

- klient int

- marka_samochodu int

- data_wypozyczenia timestamp

Potrzebuję napisać funkcję która nie pozwoli klientowi wypożyczyć drugiego samochodu jeśli ten ma wypożyczony inny dłużej niż 2 miesiące.

Stworzyłem funkcję która zwraca triggera a główny warunek zrobiłem w ten sposób:

(...)
IF (SELECT COUNT(data_wypozyczenia) FROM wypozyczalnia WHERE klient=NEW.klient) < 60 THEN RETURN NEW;

(...)

czy może bardziej:

(...)

IF(NOW()::DATE - NEW.data_wypozyczenia::DATE) < 60 THEN RETURN NEW;

(...)
Czy ten warunek jest poprawny? Chodzi mi o 60 jako liczbę dni, czy data może być przechowywana w ten sposób  tzn np 2015-06-17 jako 20150617 ?

Jeżeli nie to w jaki sposób można by poprawić ten warunek?

1 odpowiedź

+2 głosów
odpowiedź 17 czerwca 2015 przez Comandeer Guru (607,060 p.)

Tobie chodzi raczej o warunek typu

data_wypozyczenia < NOW() - INTERVAL 60 DAY

MySQL pozwala na dość swobodne operacje na datach - ważne, żeby były zapisane w odpowiednim formacie

komentarz 17 czerwca 2015 przez Cinas Nowicjusz (160 p.)
edycja 17 czerwca 2015 przez Cinas

Nie wiem, czemu ale wyskakują błędy:
 

CREATE OR REPLACE FUNCTION przetrzymanie() RETURNS TRIGGER
LANGUAGE plpgsql
AS
' BEGIN
IF (data_wypozyczenia<(NOW()-INTERVAL 60 DAY)) THEN
RETURN NEW;
ELSE
RAISE NOTICE ''Klient przetrzymuje inny samochod dluzej niz 60dni'';
RETURN NULL;
END IF;
END; ' ;
CREATE TRIGGER miesiace_max_trigger BEFORE INSERT ON wypozyczalnia FOR EACH ROW EXECUTE PROCEDURE przetrzymanie()

 

BŁĄD:  błąd składni w lub blisko "CREATE"

 

"przetrzymanie()" - nazwa mojej funkcji

"miesiace_max_trigger" - nazwa mojego triggera

"wypozyczalnia" - nazwa tabeli z umieszczonymi danymi (kto,co,kiedy) 

komentarz 17 czerwca 2015 przez Comandeer Guru (607,060 p.)

Zamiast CREATE OR REPLACE proponuję zostawić samo CREATE i poprzedzić całość czymś typu:

DROP FUNCTION IF EXISTS nazwaFunkcji

 

komentarz 17 czerwca 2015 przez Cinas Nowicjusz (160 p.)

Dziękuję Ci za dotychczasowe odpowiedzi jednak ciągle nie mogę tegi doprowadzić do ładu.

Pousuwałem triggera i funkcję, wkeiłem ponownie poniższy kod i wyszły mi takie błędy:

lab=> CREATE FUNCTION przetrzymanie() RETURNS TRIGGER
lab-> LANGUAGE plpgsql
lab-> AS
lab-> ' BEGIN
lab'> IF (data_wypozyczenia<( NOW()-INTERVAL 60 DAY)) THEN
lab'> RETURN NEW;
lab'> ELSE
lab'> RAISE NOTICE ''Klient przetrzymuje inny samochod dluzej niz 60dni'';
lab'> RETURN NULL;
lab'> END IF;
lab'> END;
lab'> ' ;
BŁĄD:  błąd składni w lub blisko "60"
LINIA 1: SELECT  (data_wypozyczenia<( NOW()-INTERVAL 60 DAY))
                                                     ^
ZAPYTANIE:  SELECT  (data_wypozyczenia<( NOW()-INTERVAL 60 DAY))
KONTEKST:  SQL statement in PL/PgSQL function "przetrzymanie" near line 2
lab2_smarcin=> CREATE TRIGGER miesiace_max_trigger BEFORE INSERT ON wypozyczenie FOR EACH ROW EXECUTE PROCEDURE przetrzymanie();
BŁĄD:  funkcja przetrzymanie() nie istnieje
lab=>

Z tego rozumuję, że w pierwszej lini kodu (bądź drugiej?) - jest błąd składni

W czwartej (bądź piątej?) lini kodu jest problem z niedomkniętym nawiasem lub cudzysłowiem.

komentarz 17 czerwca 2015 przez Comandeer Guru (607,060 p.)
Ty to odpalasz w PostgreSQL? Jeśli tak, to nie znam ichniejszej składni od dat - podałem Ci wersję z MySQL. Być może (a raczej - na pewno) w tym jest problem
komentarz 17 czerwca 2015 przez Cinas Nowicjusz (160 p.)
edycja 18 czerwca 2015 przez Cinas
OK, bardzo dziękuję Ci za dotychczasową pomoc. Tak, to jest Posrgres.

Zakończyłem swoją pracę takim warunkiem:

IF (NOW()::DATE-NEW.data_wypozyczenia::DATE < 00000200) THEN
        RETURN NEW;

Nie jestem do końca przekonany czy jest to poprawna forma, ale skompilowało się i jakoś działa.

Podobne pytania

–1 głos
3 odpowiedzi 880 wizyt
pytanie zadane 2 czerwca 2015 w C i C++ przez AdrianoVX Nowicjusz (150 p.)
0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 23 maja 2015 w JavaScript przez blondes Nowicjusz (120 p.)

93,456 zapytań

142,452 odpowiedzi

322,722 komentarzy

62,837 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

Kursy INF.02 i INF.03
...