- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- [Mysql] Ricerca tra intervalli di date
-
[Mysql] Ricerca tra intervalli di date
Sto sviluppando uno script che calcola il preventivo per un'agenzia di viaggi.
Come sapete il prezzo cambia in base alla stagione.Nel database ho
date_from - date_to
2009-05-02 | 2009-05-09
2009-04-11 | 2009-04-18
2009-04-18 | 2009-04-25
2009-04-25 | 2009-05-02
2009-05-02 |2009-05-09
2009-05-09 | 2009-05-16
2009-07-04 | 2009-07-11
2009-07-11 | 2009-07-18Insomma tutti intervalli di date, ogni riga ha un certo ID, quello che devo fare io è ricavare tutte righe che includano i periodi di vancanza scelti dal cliente.
Ho provato conSELECT * FROM
packages
WHEREdate_from
>='2009-05-01' anddate_to
<= '2009-07-15'Ma in questo caso non ottengo l'ultima riga del database, ovvero l'intervallo
2009-07-11 | 2009-07-18
questo perchè 2009-07-11 è si >= di '2009-05-01' ma 2009-07-18 NON è <= a '2009-07-15'.Come faccio ad includere anche questo risultato? Sbaglio la query?
-
Prova ad utilizzare OR invece di AND
Tabella logica AND (V = Vero, F = Falso)
F and F = F
F and V = F
V and F = F
V and V = VTabella logica OR
F or F = F
F or V = V
V or F = V
V or V = VCiao!
-
No, altrimenti prende come vere anche le righe che non c'entrano nulla.
Ci sono centinaia di date inferiori del 25-maggio nel database.
-
Puoi cercare le date maggiori o uguali a 'date_from', rendendo inutile il campo 'date_to'.
SELECT * FROM
packages
WHEREdate_from
>= '2009-05-01'
-
si ma mi devo fermare ad uncerto punto.
Se il cliente vuole fare un viaggi dal 1 maggio al 20maggio?
Il problema è che se metto date_to<= 20 maggio,
non otterrei la riga che ha questo intervallo 18 maggio - 25 maggio, proprio perch+ 25 maggio non è <= di 20maggio
-
Se vuoi mettere un limite maggiore alla data richiesta allora puoi fissare direttamente date_to <= '2009-07-25'
-
Ciao x3d0,
se non ricordo male per gli intervalli di tempo dovrebbe esserci anche l'operatore BETWEEN: dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_not-between prestando attenzione a cosa dice la guida:
For best results when using BETWEEN with date or time values, you should use CAST() to explicitly convert the values to the desired data type. Examples: If you compare a DATETIME to two DATE values, convert the DATE values to DATETIME values. If you use a string constant such as '2001-1-1' in a comparison to a DATE, cast the string to a DATE.
-
Ciao,
se ho capito bene, con i dati del tuo esempio, ricercando gli intervalli in base alla selezione dell'utente 2009-05-01 / 2009-07-15 dovresti ottere questi intervalli:2009-04-25 | 2009-05-02
2009-05-02 |2009-05-09
2009-05-09 | 2009-05-16
2009-07-04 | 2009-07-11
2009-07-11 | 2009-07-18ovvero recuperare tutti gli intervalli che hanno almeno un giorno in comune con l'intervallo scelto dall'utente.
Per fare questo non è sufficiente una coppia di condizioni, ma l'espressione condizionale è più complessa perchè hai varie casistiche da considerare.
Dati:
intervalli sul db date_from - date_to
intervallo utente user_from - user_toTutte le seguenti condizioni generano risultati corretti:
date_from < user_from < date_to
date_from < user_to < date_to
user_from < date_from < user_to
user_from < date_to< user_toLascio a te il "divertimento" di scrivere l'espressione condizionale equivalente (con tutte le semplificazioni del caso) da inserire nella query.
Alessandro
-
io ho pensato di fare in questa maniera.
Calcolo tutte le righe che mi dà.
Poi vado a leggere l'ultimo giorno in cui finisce l'ultimo periodo
Se quel giorno è minore dell'ultimo giorno di vacanza del cliente, vado a leggere la riga che ha come date_from un valore maggiore dell'ultima riga e un date_to minore dell'ultimo giorno di vacanza.dobvrebbe funzionare
-
Ciao,
la query que stai creando dovrebbe essere questa:SELECT *
FROMtestdata
WHERE ( '2009-05-01' >= date_from
AND
'2009-05-01' <= date_to
)
OR ( '2009-07-15' >= date_from
AND
'2009-07-15' <= date_to
)peró credo che manca un altro caso, quando il periodo selezionato si trova dentro un periodo piú grande, ad esempio, come fascia di prezzo hai un anno intero (2009-01-01 - 2009-12-31) e il tuo periodo si trova dentro, in questo caso aggiungi questo or:
OR
('2009-05-01'<=date_from AND '2009-07-15'>=date_to)Cosí dovrebbe funzionare.
Peró, parere strettamente personale, non mi piacciono i sistemi in cui hai le fasce di prezzo inserite in periodi, preferisco, anche se hai un'occupazione maggiore sul db, un sistema che mantiene i prezzi giorno per giorno, molto piú flessibile da gestire e applicare.
Ciao
Giuseppe
-
faster2b ti amo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Passerei all'altra sponda per un uomo che mi dà una query del genere!!!
Fantastico!!! E' proprio la query che cercavo!!!!
Ti farei un altare!!!!!!!!!!Grazie 1x10^9!!!!!!!