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