Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 35
  1. #1
    Utente di HTML.it L'avatar di allin81
    Registrato dal
    Mar 2011
    Messaggi
    1,875

    mysql query between 2 date

    Buonasera
    devo estrarre delle offerte di hotels dal database mysql.

    Quando inserisco le offerte, per fare prima ed inserire meno righe nel db inserisco range di date piu' lunghi, per esempio succede che per un'offerta indico che nel range di date tra il 20 aprile al 22 maggio, chi vuole fare un soggiorno di 7 notti paga 299 €

    Nel database inserisco questi campi:
    valida_da = 2022-04-22
    valida_fino = 2022-05-22
    id_hotel = l'id dell'hotel con altri dettagli presi da altri campi.

    al momento sto utilizzando questa query che pero' non estrae questa offerta.
    in pratica simulo un utente che cerca offerte dall'1 al 6 maggio
    codice:
    SELECT *
    FROM offerte
    WHERE valida_da BETWEEN CAST('2022-05-01' AS DATE) AND CAST('2022-05-06' AS DATE)
    Mi rendo conto che 22/04/2022 non è tra 1 e 6 maggio, ma avrei bisogno di un aiuto per poter estrarre questa offerta.

    Quale altra clausola potrei utilizzare per estrarre quell'offerta a chi cerca dall'1 al 6 maggio?
    Grazie

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    codice:
    SELECT *
    FROM offerte
    WHERE (cast(:datadal as date)  BETWEEN valida_da  AND valida_fino)
    and (cast(:dataal as date)  BETWEEN valida_da  AND valida_fino)
    Ultima modifica di 123delphi321; 15-03-2022 a 13:32

  4. #4
    Utente di HTML.it L'avatar di allin81
    Registrato dal
    Mar 2011
    Messaggi
    1,875
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    codice:
    SELECT *
    FROM offerte
    WHERE (cast(:datadal as date)  BETWEEN valida_da  AND valida_fino)
    and (cast(:dataal as date)  BETWEEN valida_da  AND valida_fino)
    forse sto sbagliando ma modifico cosi':
    codice:
    SELECT *
    FROM offerte
    WHERE cast(:2022-05-01 as date)  BETWEEN valida_da  AND valida_fino
    and cast(:2022-05-06 as date)  BETWEEN valida_da  AND valida_fino
    pero' mi restituisce errore:
    #1064 - Errore di sintassi nella query SQL vicino a ':2022-05-01 as date) BETWEEN valida_da AND valida_fino
    and cast(:2022-05-06 a' linea 3




  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    perdonami, ma io utilizzo firebird SQL e i 'due punti' prima della parola rappresentano un parametro esterno

    invece di :2022-05-01 devi prevedere l'inserimento di un parametro esterno

  6. #6
    Utente di HTML.it L'avatar di allin81
    Registrato dal
    Mar 2011
    Messaggi
    1,875
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    perdonami, ma io utilizzo firebird SQL e i 'due punti' prima della parola rappresentano un parametro esterno

    invece di :2022-05-01 devi prevedere l'inserimento di un parametro esterno
    si infatti adesso sembra funzionare bene, faccio qualche test e ti aggiorno, ma credo che hai centrato il punto.
    Grazie, gentilissimo!!

  7. #7
    Utente di HTML.it L'avatar di allin81
    Registrato dal
    Mar 2011
    Messaggi
    1,875
    dai test sembra funzionare alla grande, adesso ho solo un ultimo "problema".

    consideriamo sempre una ricerca dell'utente dall'1 al 6 maggio

    ho delle offerte che sono inserite cosi:

    valida_da: 20/04/2022 - valida fino: 02/05/2022: 75 € al giorno a persona
    valida_da: 02/05/2022 - valida fino: 30/05/2022: 63 € al giorno a persona

    Utilizzando la query che mi hai consigliato, vorrei poter estrarre anche questi prezzi e magari prendendo 1 giorno a 75 € e 4 giorni a 63 €

    Dico 1 giorno a 75€ perche' la prima offerta è valida fino al 2 maggio, quindi dall'1 al 2 maggio pagano 75 €, poi dal 2 maggio in poi il prezzo scende a 63 € e quindi sarebbero altre 4 notti a quel prezzo.

    E' fattibile come cosa??
    Sarebbe la ciliegina sulla torta, perche' accadra' spesso che a ridosso del cambio date qualche offerta non verrà visualizzata per come sta adesso la query.

    Grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    devi considerare che l'arrivo il giorno 1 e la partenza il 6, conteggiano 5 notti, vero ?

    ho questa soluzione applicata ad una tabella listino, dove ho inserito 4 date riferibili al tuo esempio
    Cattura1.GIF
    con una query, estraggo le righe di listino interessate (non si vedono le colonne iniziali x limite del forum),
    Cattura2.GIF
    con una query simile calcolo il numero di notti ed il costo totale,
    Cattura3.GIF

    le queries sono costruite per ms sql, spero ti sia semplice adattarle al gestore del tuo db
    codice:
    -- elenco dei periodi selezionati dal listino e relativo prezzoSELECT 
      a.li_ID
    , a.li_struttura
    , a.li_tipologia
    , a.li_camera
    , a.data_arrivo
    , a.data_partenza
    , a.li_inizio
    , a.li_fine
    , a.giorni
    , a.li_base
    , a.giorni * a.li_base AS tot_base
    FROM 
    (
    SELECT
      li_ID
    , li_struttura
    , li_tipologia
    , li_camera
    , CONVERT(varchar, @data_arrivo,   23) AS data_arrivo    -- la data di arrivo e
    , CONVERT(varchar, @data_partenza, 23) AS data_partenza  -- la data di partenza sono indicate come parametri (@)
    , CONVERT(varchar, li_inizio,      23) AS li_inizio
    , CONVERT(varchar, li_fine,        23) AS li_fine
    , DATEDIFF(day,
          ( SELECT CASE WHEN @data_arrivo   > li_inizio
                        THEN @data_arrivo   ELSE li_inizio END ),
          ( SELECT CASE WHEN @data_partenza < li_fine 
                        THEN @data_partenza ELSE li_fine   END )
      )
    + ( SELECT CASE WHEN @data_partenza <= li_fine THEN 0 ELSE 1 END ) AS giorni
    , li_base
      FROM LISTINO
     WHERE li_struttura=@struttura
       AND li_tipologia=@tipologia
       AND li_camera=@camera
       AND NOT (@data_partenza < li_inizio OR li_fine < @data_arrivo)
    ) a
    ORDER BY a.li_inizio;
    codice:
    -- calcolo del prezzo totale
    SELECT
      a.li_struttura
    , a.li_tipologia
    , a.li_camera
    , MIN( a.data_arrivo )        AS data_arrivo
    , MAX( a.data_partenza )      AS data_partenza
    , MIN( a.li_inizio )          AS li_inizio
    , MAX( a.li_fine )            AS li_fine
    , SUM( a.giorni )             AS tot_giorni
    , SUM( a.giorni * a.li_base ) AS tot_base
    FROM 
    (
    SELECT
      li_struttura
    , li_tipologia
    , li_camera
    , CONVERT(varchar, @data_arrivo,   23) AS data_arrivo
    , CONVERT(varchar, @data_partenza, 23) AS data_partenza
    , CONVERT(varchar, li_inizio,      23) AS li_inizio
    , CONVERT(varchar, li_fine,        23) AS li_fine
    , DATEDIFF(day,
          ( SELECT CASE WHEN @data_arrivo   > li_inizio
                        THEN @data_arrivo   ELSE li_inizio END ),
          ( SELECT CASE WHEN @data_partenza < li_fine 
                        THEN @data_partenza ELSE li_fine   END )
      )
    + ( SELECT CASE WHEN @data_partenza <= li_fine THEN 0 ELSE 1 END ) AS giorni
    , li_base
      FROM LISTINO
     WHERE li_struttura=@struttura
       AND li_tipologia=@tipologia
       AND li_camera=@camera
       AND NOT (@data_partenza < li_inizio OR li_fine < @data_arrivo)
    ) a 
    GROUP BY a.li_struttura, a.li_tipologia, a.li_camera

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    dovrebbe bastare solo l'ultima query che calcola il totale,
    ma con la prima puoi analizzare le righe che compongono il totale
    vedrai che entrambe le queries ne hanno una interna identica
    ed il "vestito" esterno ne regola il risultato

    ps, nella prima query la "select" é rimasta attaccata al commento che la precede
    il copia incolla funziona così .....
    Ultima modifica di marino51; 15-03-2022 a 23:21

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    Quote Originariamente inviata da allin81 Visualizza il messaggio
    dai test sembra funzionare alla grande, adesso ho solo un ultimo "problema".

    consideriamo sempre una ricerca dell'utente dall'1 al 6 maggio

    ho delle offerte che sono inserite cosi:

    valida_da: 20/04/2022 - valida fino: 02/05/2022: 75 € al giorno a persona
    valida_da: 02/05/2022 - valida fino: 30/05/2022: 63 € al giorno a persona

    Utilizzando la query che mi hai consigliato, vorrei poter estrarre anche questi prezzi e magari prendendo 1 giorno a 75 € e 4 giorni a 63 €

    Dico 1 giorno a 75€ perche' la prima offerta è valida fino al 2 maggio, quindi dall'1 al 2 maggio pagano 75 €, poi dal 2 maggio in poi il prezzo scende a 63 € e quindi sarebbero altre 4 notti a quel prezzo.

    E' fattibile come cosa??
    Sarebbe la ciliegina sulla torta, perche' accadra' spesso che a ridosso del cambio date qualche offerta non verrà visualizzata per come sta adesso la query.

    Grazie
    ciao, con la query che ti ho suggerita il record
    valida_da: 20/04/2022 - valida fino: 02/05/2022: 75 € al giorno a persona
    non verrebbe preso in considerazione!

    a quanto capisco tu vuoi prendere in considerazione la migliore offerta giornaliera al di là di se l'offerta comprende tutti i giorni della richiesta.

    non so, cerca di chiarire bene con un'analisi chiara.

    una soluzione potrebbe essere quella di ottenere, tramite una query, un listino giornaliero con i migliori prezzi estratto dalle varie offerte disponibili e da questo risultato catturare le offerte migliori di ogni singolo giorno.

    se però ti muovi tra offerte con date diverse devi fare attenzione che vengano coperti tutti i giorni richiesti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.