[ alfa-pro @ 12.02.2016. 10:33 ] @
Drustvo imam mali problem oko procedure koju pravim za app koja je za renta kar.

Covek ima dve vrste cena (Sezonske cene i van sezonske cene)

Ja sam napravio tablelu sezone gde upisujem ime sezone i pocetak kraj. Pomocu pocetka i kraja i izabranih datuma od strane korisnika ja utvrdjujem
cenu i prikazujem je. Treba da se prikaze cena za taj neki period

Sezone

Code:
ID_Sezone     Pocetak     Kraj            Naziv_Sezone_Sr   Naziv_Sezone_En  Naziv_Sezone_Ru  
---------    ----------    ----------   ---------------     ---------------  -----------------
1              2016-05-01   2016-08-31  Sezonka              (NULL)                 (NULL)           
2              2016-09-01   2016-12-31  Vansezonska        (NULL)                 (NULL)      



Cene sezona

Code:

    ID    Cena  ID_Sezone  ID_Automobila  
------  ------  ---------  ---------------
     1     150          1                1
     2     120          2                2
     3      70          1                3
     4      60          1                4
     5     220          2                5
     6     457          2                6           


Ova gornja tabela cene sezona upisuje id sezone i cenu za svaki automobil. Svako vozilo ima svoju cenu.

Evo procedure

Code:
DELIMITER $$
DROP PROCEDURE IF EXISTS `izracunajCenu`$$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `panauto_site`.`izracunajCenu`(pocetak DATE, kraj DATE)
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
    BEGIN
    
    SELECT a.name, s.Naziv_Sezone_Sr, c.Cena
    FROM cene_sezona c
    INNER JOIN sezone s ON s.ID_Sezone = c.ID_Sezone
    INNER JOIN automobili a  ON a.ID = c.ID_Automobila
    WHERE s.Pocetak <= pocetak AND s.Kraj >= kraj BETWEEN s.Pocetak AND s.Kraj;
    
    END$$

DELIMITER ;


E sada kada pozovem:

CALL izracunajCenu('2016-05-01','2016-08-31');

dobijem listu:
Code:

name        Naziv_Sezone_Sr    Cena  
----------  ---------------  --------
Opel Corsa  Sezonka               150
VW Polo     Sezonka                70
Fiat Bravo  Sezonka                60


A ako ukucam CALL izracunajCenu('2016-08-01','2016-09-31'); ja i dalje dobijam lisu sa sezonskim cenama.
Nesto ja ovde u WHERE nisam uradio kako treba i on mi na osnovu unesenog datuma ne filtrira kako treba.

[ Orome @ 12.02.2016. 12:04 ] @
koliko vidim WHERE uslov ti treba izgledati ovako

SELECT a.name, s.Naziv_Sezone_Sr, c.Cena
FROM cene_sezona c
INNER JOIN sezone s ON s.ID_Sezone = c.ID_Sezone
INNER JOIN automobili a ON a.ID = c.ID_Automobila
WHERE s.Pocetak <= pocetak AND s.Kraj >= kraj ;

ako imas 2 datuma kao sto imas pocetak i kraj onda ne moze BETWEEN.

between se koristi kad imas jednu kolonu datuma i hoces select na osnovu te kolone sa parametrima pocetak i kraj, to bi izgledalo ovako

WHERE (datumska_kolona BETWEEN '2016-05-01' AND '2016-08-31') tj WHERE (datumska_kolona BETWEEN pocetak AND kraj)
[ jablan @ 12.02.2016. 12:04 ] @
Šta znače početak i kraj koji korisnik unosi? Šta ako početak i kraj nisu u istoj sezoni?

BTW nije mi jasno zašto praviš stored proceduru kad je u pitanju običan query.
[ alfa-pro @ 12.02.2016. 12:40 ] @
@Orome
Ma nece probao sam i ja to. Evo kada copy paste tvoj primer i unesem

Code:
CALL izracunajCenu('2016-09-01','2016-09-21');
vracam mi NULL a trebaobi da prikaze van sezonsku cenu
Code:
CALL izracunajCenu('2016-05-01','2016-06-21');  
vraca mi sezonsku cenu


@jablan koristim proceduru zato sto je to samo deo koda i mnogo mi je lakse na ovom projektu da nesto izmenim u bazi nego da se cimam da jurim entitete po kodu...
[ alfa-pro @ 12.02.2016. 12:48 ] @
------------------ Update ------------

@Orome tvoj primer je dobar samo sto sam ja promenio
Code:
    WHERE (a.ID = vozilo) AND (s.Pocetak >= pocetak AND s.Kraj >= kraj) ;    

i sada radi prikazuje kako treba. Sada sam ja samo prosledio jos jedan parametar za vozilo sto je nebitno bilo cisto da vas ne zbuni.