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