Back to top

Autore Topic: [RISOLOTO] aiuto per stringa sql  (Letto 4012 volte)

Offline elleoerre

  • Appassionato
  • ***
  • Post: 218
  • Sesso: Maschio
    • Mostra profilo
[RISOLOTO] aiuto per stringa sql
« il: 15 Ott 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:
Codice: [Seleziona]
SELECT * FROM mattinale WHERE data>=15/10/2014 AND data <=16/10/2014e 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....
« Ultima modifica: 27 Ott 2014, 20:45:06 da elleoerre »

Offline steganoga

  • Abituale
  • ****
  • Post: 1313
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #1 il: 15 Ott 2014, 16:21:46 »
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 ...
« Ultima modifica: 15 Ott 2014, 16:23:24 da steganoga »
...sono dove non ti aspetti di trovarmi, mi alimento della tua supponenza e disseto la mia curiosità nel silenzio.
Non sono un nemico, considerami un ospite.

Offline elleoerre

  • Appassionato
  • ***
  • Post: 218
  • Sesso: Maschio
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #2 il: 15 Ott 2014, 17:05:48 »
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?

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #3 il: 15 Ott 2014, 18:24:18 »
aggiungi un campo date alla  tabella e procedi come suggerito.
mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline Dracoscrigno

  • Esploratore
  • **
  • Post: 62
  • Sesso: Maschio
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #4 il: 17 Ott 2014, 12:36:04 »


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'
Codice: [Seleziona]
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'
Codice: [Seleziona]
data = 16/10/2014 AND turno = 'notte'

Citazione
dovrebbe diventare:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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)
« Ultima modifica: 17 Ott 2014, 12:38:20 da Dracoscrigno »
Se pensi che io sia una macchina uno di noi non merita d' esser un uomo

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #5 il: 17 Ott 2014, 17:08:01 »
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 web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline Dracoscrigno

  • Esploratore
  • **
  • Post: 62
  • Sesso: Maschio
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #6 il: 17 Ott 2014, 18:15:58 »
@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.

Se pensi che io sia una macchina uno di noi non merita d' esser un uomo

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #7 il: 20 Ott 2014, 08:00:33 »
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.
mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline elleoerre

  • Appassionato
  • ***
  • Post: 218
  • Sesso: Maschio
    • Mostra profilo
Re:aiuto per stringa sql
« Risposta #8 il: 27 Ott 2014, 20:44:35 »
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:
Codice: [Seleziona]
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.

 



Web Design Bolzano Kreatif