• User Attivo

    [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-18

    Insomma 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 con

    SELECT * FROM packages WHERE date_from >='2009-05-01' and date_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?


  • User Attivo

    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 = V

    Tabella logica OR
    F or F = F
    F or V = V
    V or F = V
    V or V = V

    Ciao!


  • User Attivo

    No, altrimenti prende come vere anche le righe che non c'entrano nulla.
    Ci sono centinaia di date inferiori del 25-maggio nel database.


  • User Attivo

    Puoi cercare le date maggiori o uguali a 'date_from', rendendo inutile il campo 'date_to'.

    SELECT * FROM packages WHERE date_from >= '2009-05-01'


  • User Attivo

    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


  • User Attivo

    Se vuoi mettere un limite maggiore alla data richiesta allora puoi fissare direttamente date_to <= '2009-07-25'


  • ModSenior

    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.


  • User Attivo

    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-18

    ovvero 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_to

    Tutte 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_to

    Lascio a te il "divertimento" di scrivere l'espressione condizionale equivalente (con tutte le semplificazioni del caso) da inserire nella query.

    Alessandro


  • User Attivo

    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


  • User

    Ciao,
    la query que stai creando dovrebbe essere questa:

    SELECT *
    FROM testdata
    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


  • User Attivo

    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!!!!!!!