Joomla.it Forum
Non solo Joomla... => Database => : elleoerre 15 Oct 2014, 16:18:35
-
Salve, sono ancora una volta qui per chiedere il vostro preziosissimo aiuto dato che non sono un grande esperto di stringhe sql. Vi spiego qual'è la mia richiesta e la mia incertezza.
Ve la faccio breve: in una tabella di nome "mattinale", tra i vari campi ce ne sono due denominati "data" e "turno". Ora, la data, come è facile dedurre, contiene un valore di data appunto, mentre il campo turno contiene progressivamente i valori "Notte", "Mattina", "Pomeriggio", "Sera". Quindi volendo riportare la tabella con i valori mostrati, avremmo una cosa simile:
ID..........data...................turn o.............ecc....
1 15/10/2014 Notte
2 15/10/2014 Mattina
3 15/10/2014 Pomeriggio
4 15/10/2014 Sera
5 16/10/2014 Notte
6 16/10/2014 Mattina
7 16/10/2014 Pomeriggio
8 16/10/2014 Sera
9 17/10/2014 Notte
10 17/10/2014 Mattina
11 17/10/2014 Pomeriggio
12 17/10/2014 Sera
Volendo effettuare una ricerca di un periodo per esempio dal 15/10/2014 al 16/10/2014, la stringa SQL sarebbe qualcosa del genere:
SELECT * FROM mattinale WHERE data>=15/10/2014 AND data <=16/10/2014
e cioè vengono selezionati tutti quei record che hanno il valore del campo data compreso tra il 15 e il 16. Fin qui tutto ok.
La mi domanda è però, e se volessi effettuare una interrogazione più dettagliata e cioè per esempio selezionare tutti i record che vanno dal turno Mattina del 15/10/2014 al turno Notte del 16/10/2014? Quindi verrebbero selezionati tutti i record con id che va dal 2 al 5 nel nostro caso.
Ho provato a raggionarci un pò ma non ho trovato soluzione per quelle che sono le mie minime competenze di SQL, magari qualcuno mi può aiutare?
Grazie....
-
http://www.tutorialspoint.com/mysql/mysql-between-clause.htm
mattina e sera vuol dire a partire dall'ora fino all'ora quindi se il formato data è Y-m-d 00:00:00 ...
-
Si ok, ma per ragioni strane che adesso non ricordo ho dovuto creare 2 campi e cioè data e turno che sono entrambi di tipo VARCHAR, come posso fare?
-
aggiungi un campo date alla tabella e procedi come suggerito.
-
se ho capito hai detto che sia la data che il turno sono tipi stringa...
considerando 'mattina', 'pomeriggio', 'sera', 'notte' come possibili valori del turno della medesima data
non funziona così?
tutte le tuple che soddisfano il giorno iniziale, in questo caso 15/10/2014 MENO, le tuple che contengono o non contengono qualche turno, in questo caso non devono contenere 'notte' data=15/10/2014 AND NOT turno = 'notte'
più
tutte le tuple che soddisfano il giorno finale, in questo caso 16/10/2014 MENO, le tuple che contengono o non contengono qualche turno, in questo caso cerchiamo solo 'notte'
data = 16/10/2014 AND turno = 'notte'
dovrebbe diventare:SELECT * FROM mattinale WHERE ( data=15/10/2014 AND NOT turno = 'notte') OR (data = 16/10/2014 AND turno = 'notte')
in questo caso, giorno iniziale e giorno finale sono uno successivo all' altro e quindi non ci sono giorni che intercorrono tra il primo e l' altro.
Nel caso ci fossero dovrebbe essere sufficiente aggiungere anche i giorni intercorrenti le due date.
supponendo di volere le tuple dalla mattina del 15 alla notte del 17 sarebbe:SELECT * FROM mattinale WHERE ( data=15/10/2014 AND NOT turno = 'notte') OR (data = 17/10/2014 AND turno = 'notte') OR (data = 16/10/2014)
-
mettiamo che io voglia i turni dal pomeriggio del 24/12 alla mattina del 26/12, come scrivi l'algoritmo per la generazione della query? ovviamente la query deve essere creata dinamicamente.
non si risolve un problema creandone altri tre, la soluzione giusta è quella di steganoga
-
@mmleoni
Se la sintassi è corretta.
L algoritmo completo per qualsiasi lasso di tempo è lampante. E se lo vedo io che di sql non ne so niente immagino lo veda anche tu.
Ed una volta ricavato l algoritmo lo si può ovviamente automatizzare.
Il metodo è certamente sbrigativo ma è il primo che mi è venuto in mente con la clausola: "non cambiare la struttura della tabella" , quindi un alternativa a quanto proposto in precedenza.
-
a me non sembra lamapante, ma basta che lo sia elleoerre.
io resto però della mia idea: si interviene sull'origine del problema, non se ne introducono altri.
-
Grazie a tutti per aver risposto e contribuito alla soluzione!!! Ho seguito il consiglio di Dracoscrigno solo per non cambiare la struttura della tabella, anche perchè altrimenti avrei dovuto riconvertire i dati già salvati nella tabella nel campo data e turno.
Seguendo le dritte di DRacoscrigno ho trovato la stringa giusta che fa al caso mio, l'unica cosa che ho dovuto cambiare è stato "notte - mattina - pomeriggi - sera" in "00/07 - 07/13 - 13/19 -19/24" e la stringa adoperata è stata la seguente:
SELECT * FROM mattinale WHERE (data>'".$form->data['d1']."' AND data<'".$form->data['d2']."') OR (data='".$form->data['d1']."' AND turno>='".$form->data['t1']."') OR (data='".$form->data['d2']."' AND turno<='".$form->data['t2']."') ORDER BY cf_id ASC
[code]
dove d1= data d'inizio, t1= turno d'inizio, d2= data di fine e t2= turno di fine
Funzione e a me va bene così!!! :-) Grazie comunque a tutti per l'aiuto e iconsigli.
La soluzione di mmleoni sicuramente sarebbe stata più immediata e semplice ma a mio parere bisognava implementarla da subito, al momento della progettazione del prodotto.