Newsgroup: it.comp.software.database
Titolo: SQL per selezione date

Stò scrivendo un piccolo gestionale e mi occorre sapere quali posti sono 
liberi per il periodo indicato.
Uso MySql due campi data dataini e datafine periodo prenotato.
Attraverso una sql vorrei estrarre in base al periodo indicato
tutti i posti occupati completamente in quel periodo e/o anche
solo quelli parzialmente occupati (e saperlo anche usando query diverse).
Ho provato con questa sql:
'SELECT * FROM prenotazioni WHERE (dataini BETWEEN ''' + dataini + ''' 
AND ''' + datafine + ''') OR (datafine BETWEEN ''' + dataini + ''' AND 
''' + datafine + ''')'
ma non so se è corretta al 100%
mi date un suggerimento ?
Omega

 mi date un suggerimento ?
describe prenotazioni;


prenotazioni č una tabella innodb con campo id contatore e chiave 
primaria dataini e datafine sono campi formato data che contengono 
rispettivamente al data di inizio e fine prenotazione.

 rispettivamente al data di inizio e fine prenotazione.
Questo lo immaginavo.
Se la tabella contenesse solo quei 3 campi non so dove come faresti a 
salvare le informazioni su quali posti sono stati prenotati.
Volevo la struttura della tabella non per farmi gli affari tuoi, ma per 
capire di piů com'era organizzata la cosa...
Anche perchč la tua query di prima (che mi sembrava giusta a parte gli 
apici che non ho guardato bene) ti restituisce i posti prenotati in 
quella data, se la tabella č un registro di quali posti sono stati 
prenotati e in quale periodo. Mentre tu volevi il complemento di questo, 
giusto?

 
ok la prenotazione riguarda semplicemente le camere quindi ho questi 
altri 2 campi camera (tipo di camera se singola matrimoniale suite etc) 
e numerocamera nulla di piů.
in particolare mi accorgo anche di non sapere se mysql lavora bene con 
gli operatori < > <= >= <> sulle date.
Omega

 gli operatori < > <= >= <> sulle date.
bene.
mysql> select * from prenotazioni;
+----+------------+------------+--------------+
| id | dataini    | datafine   | numerocamera |
+----+------------+------------+--------------+
|  1 | 2005-07-01 | 2005-07-31 |            4 |
|  2 | 2005-07-03 | 2005-07-24 |            3 |
|  3 | 2005-08-04 | 2005-08-13 |            4 |
+----+------------+------------+--------------+
3 rows in set (0.00 sec)
mysql> select * from camera;
+--------+
| numero |
+--------+
|      1 |
|      2 |
|      3 |
|      4 |
+--------+
4 rows in set (0.04 sec)
supponiamo che nel tuo albergo ci siano 4 camere.
cerco le camere occupate tra il primo di agosto e il 3.
mysql> select distinct numerocamera from prenotazioni where 
dataini<'2005-08-1' and datafine>'2005-08-3';
Empty set (0.00 sec)
cerco le camere occupate tra il 25 luglio e il 26.
mysql> select distinct numerocamera from prenotazioni where 
dataini<'2005-07-25' and datafine>'2005-07-26';
+--------------+
| numerocamera |
+--------------+
|            4 |
+--------------+
1 row in set (0.00 sec)
A questo punto devi fare il complemento dell'insieme. Se hai un 
mysql>=4.1 puoi usare la clausola not in altrimenti vai in join cosě, ad 
esempio per le camere libere dal 25 al 26 luglio:
mysql> create temporary table occupate select distinct numerocamera from 
prenotazioni where dataini<'2005-07-25' and datafine>'2005-07-26';
mysql> select numero from camera left join occupate on 
(numerocamera=numero) where numerocamera is null;
+--------+
| numero |
+--------+
|      1 |
|      2 |
|      3 |
+--------+
3 rows in set (0.00 sec)

 3 rows in set (0.00 sec)
Accidenti io l'avevo semplificata un pò troppo. Sei stato fantastico ti 
ringrazio moltissimo. Ora vado subito a provare il tutto. Giusto per 
farti sapere è la 4.0.24 quella che uso.
Grazie ancora anche se so che in alcuni gruppi bisogna evitare i 
ringraziamenti.
Omega

 Omega
mi sebrava giusto farti vedere l'implementazione:
  'DELETE FROM prenotazioni WHERE (camera = ''1'') AND (numero = ''6'') 
AND (dataini <= ''2005-07-01'') AND (datafine >= ''2005-07-01'')'
come vedi utilizzo una sola query utilizzando un unica data (in questo 
modo l'utente seleziona un singolo valore e non due inizio e fine).
La query funziona correttamente anche su periodi di prenotazione di un 
solo giorno.
Grazie ancora !!
Omega

 Non capisco. Che ci fai con una delete?
Questa è la fase successiva dove permetto all'utente di eliminare una 
prenotazione digitata erroneamente oppure disdetta, tutto qui.
Omega

 AND (dataini <= ''2005-07-01'') AND (datafine >= ''2005-07-01'')'
Non capisco. Che ci fai con una delete?

 prenotazione digitata erroneamente oppure disdetta, tutto qui.
Ah ok.
Scusa ma non avevo capito in che modo si inseriva in tutto il discorso 
di prima quella istruzione delete.
Ciao

> Questa è la fase successiva dove permetto all'utente di eliminare una 

Niente niente figurati !!!
omega