Newsgroup: it.comp.www.php
Titolo: Calcolare i prezzi di una vacanza

Salve a tutti,
ho la necessita di fare un calcolo sulla base di un listino prezzi. Il
listino lo memorizzo in una tabella mysql nella quale ci sono due
campi (Date) "Dal" e "Al" che contengono i periodi e negli altri campi
i relativi prezzi.
Pensavo di far inserire all'utente il periodo per poi ciclare su ogni
giorno del periodo e chiedere ad una apposita funzione quanto costa
quel giorno e sommarlo ottenendo alla fine del ciclo il totale.
Mi trovo in difficolta nel mettere in pratica questa idea. Non sono
sicuro sia la strada miglior. Ma, anche se fosse, non riesco a fare
una query sul db che passato un certo giorno mi dica a quale dei
periodi memorizzati appartenga con i relativi prezzi. Faccio ad es.
SELECT Prezzo FROM Prezzi WHERE Dal >= '20050115' AND Al <= '20050215'
ma non ottengo il risultato sperato.
C'e' qualcuno che puo' aiutarmi anche consigliandomi una strada
migliore se ci fosse?
Grazie
Saluti

 SELECT Prezzo FROM Prezzi WHERE Dal >= '20050115' AND Al <= '20050215'
Forse intendevi:
SELECT Prezzo FROM Prezzi WHERE Dal <= '20050115' AND Al >= '20050215'
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

sicuro sia la strada miglior.
Tu hai una serie di periodi tipo
[D    A][D   A][D          A][D   A]
e due giorni tipo
    D1------------D2
Quindi potresti selezionare tutti i periodi nei quali hai almeno un giorno
(cioe' tali che A > D1 AND D < D2). Ottieni diciamo tre periodi, dei quali
due parziali.
A questo punto, dato un periodo, devi trovarti quanti giorni stanno dentro
quel periodo. I casi sono quattro:
......[D         A].......
---D1-----------------D2--
---D1-------D2------------
---------D1-----------D2--
---------D1---D2----------
a seconda che D1 < D o D1 >= D, e D2 < A o D2 >= A.
Il periodo che ti interessa e' MIN(A, D2) - MAX(D, D1).
Se non ho fatto sublimi cazzate - non sarebbe nuova, anzi - dovresti farti
una SELECT per
SELECT dal, al, prezzo FROM listini WHERE al >= inizio AND dal <= fine
poi:
	prezzotot = 0
	while( $rec = SQLFetchTuple )
		prezzotot += $rec[prezzo]*(min(fine,rec[al])-...);
Cosi' fai il ciclo sui periodi e non sui giorni, che costa meno :-)
Occhio che, se i periodi ti si sovrappongono, va considerato...!
Leonardo
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

Grazie ad entrambi per le risposte.
Riguardo in particolare alla tua, vorrei poter seguire il tuo consiglio.
Pero' se non sbaglio la seguente query (dove pcdoppia sta per pensione
completa in doppia)
SELECT Dal, Al, PCDoppia FROM prezzi WHERE Al >= '20050115' AND Dal <=
'20050101'
non dovrebbe restituirmi un record dal db e cioe' quello con i valori
dal e al "compatibili" con il periodo inserito?
(invece mi seleziona 0 records ma forse ho capito male io)
Grazie
Ciao
p.s. tra le varie ipotersi ero arrivato anche a pensare di inizializzare
ogni anno con 365 record uno per ogni giorno con il prezzo ma non mi
sembra granche' come idea.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

dal e al "compatibili" con il periodo inserito?
Aspe', io ti avevo detto: "A > D1 AND D < D2". Cioe' "Al" deve essere
maggiore (in realta' maggiore O UGUALE) alla data di *INIZIO* del tuo
periodo, non alla data di fine.
Aspetta che faccio una prova a mano: diciamo che hai nel database
Ipotesi 1: 20041215-20041231, 20050101-20050130, 20050201-20050215
Ipotesi 2: 20041215-20050130, 20050201-20050215
Ipotesi 3: 20041215-20050107, 20050108-20050215
Ipotesi 4: 20041215-20050107, 20050108-20050112, 20050113-20050215,
20050216-20050315
Il risultato che voglio ottenere e'
Ipotesi 1: 2
Ipotesi 2: 1
Ipotesi 3: 1,2
Ipotesi 4: 1,2,3
Allora, io voglio selezionare quei periodi che NON sono finiti quando
il mio periodo scelto parte; quindi, dove "Al >= 20050101". Pero' tra
quei periodi io NON voglio quelli che iniziano dopo che il periodo e'
finito; quindi devono anche avere "Dal <= 20050115".
Ora vediamo cosa succede con queste regole.
Dal <= 20050115: soddisfatta da:
Ipotesi 1: 1, 2
Ipotesi 2: 1
Ipotesi 3: 1, 2
Ipotesi 4: 1, 2, 3, 4
Al >= 20050101: soddisfatta da:
Ipotesi 1: 2, 3
Ipotesi 2: 1, 2
Ipotesi 3: 1, 2
Ipotesi 4: 1, 2, 3
L'intersezione data da AND mi da' {2}, {1}, {1,2} e {1,2,3} come deve
essere.
