Problema conteggio intervallo date

simo2508

Nuovo Utente
25 Mar 2015
1
0
0
Salve ,
ho un problema riguardante il calcolo dei prezzi per strutture in diversi periodi dell'anno. Il mio obbiettivo è : inserite le due date ; arrivo e partenza , effettuare un conteggio dei giorni e riuscire a capire in quali periodi cascano e quanti giorni sono trascorsi in ogni periodo per poter effettuare correttamente il calcolo del prezzo per quella determinata struttura .
Le mie tabelle sono così strutturate :
Codice:
CREATE TABLE `PERIODI` (
  `id_periodo` int(11) NOT NULL,
  `data_inizio` date NOT NULL,
  `data_fine` date NOT NULL,
  `descrizione` varchar(50) NOT NULL,
  PRIMARY KEY  (`id_periodo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `PREZZI` (
  `id_periodo` int(11) NOT NULL default '0',
  `id_struttura` int(11) NOT NULL default '0',
  `prezzo_giornaliero` float default NULL,
  `descrizione` varchar(500) NOT NULL,
  PRIMARY KEY  (`id_periodo`,`id_struttura`),
  KEY `id_struttura` (`id_struttura`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `STRUTTURA` (
  `id_struttura` int(11) NOT NULL auto_increment,
  `tipologia` varchar(50) NOT NULL,
  `numeroposti` int(11) NOT NULL,
  `climatizzato` varchar(10) NOT NULL,
  `descrizione` varchar(1000) NOT NULL,
  PRIMARY KEY  (`id_struttura`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;

Grazie per l'aiuto .
 

marino51

Utente Attivo
28 Feb 2013
3.041
192
63
Lombardia
ti va di fare qualche prova con la query che segue ?
è "in linea" con la tabella "periodi" che hai postato, se ti "ritrovi" possiamo fare altri passi,
ciao
Marino
PHP:
$sql = "
declare @data_arrivo   AS datetime;
declare @data_partenza AS datetime;
set @data_arrivo   = '".$data_arrivo."';
set @data_partenza = '".$data_partenza."';
SELECT * FROM (
SELECT
  1 AS tipo
, id_periodo
, @data_arrivo AS data_arrivo
, @data_partenza AS data_partenza
, data_inizio
, data_fine
, DATEDIFF(@data_arrivo, @data_partenza) AS giorni
  FROM PERIODI
 WHERE @data_arrivo>=data_inizio AND @data_partenza<=data_fine
UNION 
SELECT
  2 AS tipo
, id_periodo
, @data_arrivo AS data_arrivo
, @data_partenza AS data_partenza
, data_inizio
, data_fine
, 1 + DATEDIFF(@data_arrivo, data_fine) AS giorni
  FROM PERIODI
 WHERE @data_arrivo BETWEEN data_inizio AND data_fine
   AND @data_partenza NOT BETWEEN data_inizio AND data_fine
UNION 
SELECT
  3 AS tipo
, id_periodo
, @data_arrivo AS data_arrivo
, @data_partenza AS data_partenza
, data_inizio
, data_fine
, DATEDIFF(data_inizio, @data_partenza) AS giorni
  FROM PERIODI
 WHERE @data_partenza>=data_inizio AND @data_partenza<=data_fine
   AND @data_arrivo NOT BETWEEN data_inizio AND data_fine
UNION 
SELECT
  4 AS tipo
, id_periodo
, @data_arrivo AS data_arrivo
, @data_partenza AS data_partenza
, data_inizio
, data_fine
, 1 + DATEDIFF(data_inizio, data_fine) AS giorni
  FROM PERIODI
 WHERE @data_arrivo<data_inizio AND @data_partenza>data_fine
) a ORDER BY a.data_inizio;
";

ps. nella tabella periodi manca il codice della struttura, quindi non puoi differenziare i periodi come differenzi i prezzi

il risultato di un esempio
Cattura.PNG
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.041
192
63
Lombardia
ho scritto una query che può essere usata facilmente sia in phpmyadmin che in uno script php

in particolare i parametri esterni di ricerca sono
la data di arrivo
la data di partenza


essendo le due date, richiamate molte volte nelle select, le ho definite come parametri
(attenzione alle punteggiature presenti) con le seguenti dichiarazioni,
PHP:
declare @data_arrivo   AS datetime;
declare @data_partenza AS datetime;

ora assegno alle due date il loro valore, lo faccio una volta sola con le seguenti set
PHP:
set @data_arrivo   = '2014/03/15';	( set @data_arrivo   = '".$data_arrivo."'; )
set @data_partenza = '2014/04/14';	( set @data_partenza = '".$data_partenza."'; )


vi è poi una select "esterna" che serve a gestire i i risultati delle select "interne"
quando sei sicuro che il metodo proposto funziona, va modificata per ottenere i valori sommati

PHP:
SELECT * FROM (
....
) a ORDER BY a.data_inizio;


le select "interne", sono identificate da una colonna "tipo" che può assumere i valori 1, 2, 3 o 4
questi valori permettono di capire quali select hanno "lavorato"
perchè le select sono specifiche per questi 4 casi,

1 arrivo e partenza interni ad un periodo ( giorni = @data_partenza - @data_arrivo )
2 arrivo nel periodo, partenza in un periodo successivo ( giorni = data_fine - @data_arrivo )
3 partenza nel periodo, arrivo in un periodo precedente ( giorni = @data_partenza - data_inizio )
4 arrivo e partenza debordano il periodo ( giorni = data_fine - data_inizio )

quindi ciascuna select conta i giorni con le regole sopra esposte
( la somma dei giorni ottenuti da ciascuna select è pari al periodo di soggiorno complessivo )

PHP:
SELECT
  1 AS tipo		// arrivo e partenza interni ad un periodo
....
, DATEDIFF(@data_arrivo, @data_partenza) AS giorni
  FROM PERIODI
 WHERE @data_arrivo>=data_inizio AND @data_partenza<=data_fine

SELECT
  2 AS tipo		// arrivo nel periodo, partenza in un periodo successivo
....
, 1 + DATEDIFF(@data_arrivo, data_fine) AS giorni
  FROM PERIODI
 WHERE @data_arrivo BETWEEN data_inizio AND data_fine
   AND @data_partenza NOT BETWEEN data_inizio AND data_fine

SELECT
  3 AS tipo		// partenza nel periodo, arrivo in un periodo precedente
....
, DATEDIFF(data_inizio, @data_partenza) AS giorni
  FROM PERIODI
 WHERE @data_partenza>=data_inizio AND @data_partenza<=data_fine
   AND @data_arrivo NOT BETWEEN data_inizio AND data_fine

SELECT
  4 AS tipo		// arrivo e partenza debordano il periodo
....
, 1 + DATEDIFF(data_inizio, data_fine) AS giorni
  FROM PERIODI
 WHERE @data_arrivo<data_inizio AND @data_partenza>data_fine

se hai capito le 4 select, dedurrai che la numero 1 è alternativa alle altre
perchè se il soggiorno è all'interno di un periodo, non possono sussistere gli altri casi

con "UNION" otteniamo un unico set con i record selezionati, che sarà poi lavorato dalla select "esterna" come detto

ti consiglio di fare casi di prova, prendendo familiarità con il metodo,
cercando anche di "estremizzare" con le date di arrivo partenza coincidenti con le date di inizio e fine del periodo

se c'è altro da spiegare, fammi sapere,
ciao
Marino
 
Discussioni simili
Autore Titolo Forum Risposte Data
trattorino problema raccapricciante php conteggio query PHP 4
M Conteggio utenti online, problema al minuto 00 Classic ASP 2
F NetBeans problema creazione progetto Java Windows e Software 0
M Problema con Try Catch PHP 0
C problema seo + cerco esperto SEO e Posizionamento 1
Sergio Unia Problema con gli eventi del mouse su una data table: Javascript 2
T PROBLEMA CON SESSIONI PHP 3
A Problema, non so, di scale() o transform, oppure altro? HTML e CSS 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
L problema con query select PHP 2
R Problema query con ricerca id numerico PHP 2
F Problema con risposta PHP 0
S problema con recupero dati tabella mysql PHP 2
Z Problema con il mio tp-l i nk Reti LAN e Wireless 1
I PROBLEMA: Sostituzione sito XAMPP E-Commerce 0
T problema data 30/11/-1 PHP 0
L Problema RAM con Tomcat 8 Apache 0
napuleone problema con sort e asort PHP 4
Y Problema incolonnamento tabella PHP 7
S problema salvataggio immagini Photoshop 0
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
M Problema con controllo form in real time jQuery 6
D problema php mysql PHP 1
D problema php mysql PHP 1
M Problema Wi-Fi Linux Linux e Software 1
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
Daniele_Carrara Problema Aperture Mailup Email Marketing 5
F PROBLEMA ACCESSO INSTAGRAM Discussioni Varie 2
R Problema connessione db PHP 7
M problema if PHP 2
G Problema con Get page PHP 4
N Problema passaggio variabili tra pagine PHP 4
P Problema con require once PHP 6
P Problema con i package Java 1
A Problema login con Safari PHP 14
F INDESIGN: problema esportazione esecutivo per la stampa con foto B/N Webdesign e Grafica 1
H problema carrello woocommerce PHP 2
S problema con css bootstrap3 HTML e CSS 4
M .load() problema con caricamenti dinamici di js Javascript 0
M Problema su query JOIN in tre tabelle PHP 0
S Problema esportazione tabelle Mysql in Excel PHP 0
G Problema ------- con Query PHP 1
G Problema con Query PHP 1
M Problema su update di 3 tabelle PHP 1
T problema con select dinamica con jquery Javascript 0
A Problema checkout carrello php PHP 2
R Problema al server Domini 0
A Problema nel passare la variabile PHP 0

Discussioni simili