PDA

View Full Version : [SQL] - Sottrazione


Gin&&Tonic
01-03-2011, 10:40
Non ricordo come sottrarre 2 numeri o meglio 2 orari in SQL.

Ho il seguente schema relazionale:

• Evento (Data, Città, Nome)
• Musicista (Nome, Età, Città)
• Partecipazione (Musicista, Evento, OraInizio, OraFine, Ruolo, CompensoOrario)

E devo formulare la seguente interrogazione in SQL:
4) Per ogni musicista, il numero di partecipazioni di durata maggiore di 3 ore (NB: per durata di una partecipazione, si intende la differenza tra l’orario di fine e l’orario di inizio);


Quindi ho fatto questo:

Select P.musicista , count(*)
From Partecipazione P
where ( P.oraFine - P.oraInizio > 3 ore )
Group by P.musicista


il mio problema sta nel sottrarre : oraFine - oraInizio , qualcuno sa aiutarmi?
Grazie :muro: :muro: :muro: :muro: :muro:

Gin&&Tonic
01-03-2011, 10:55
Ragazzi ho un maledetto bisogno del vostro aiuto... :mc:
ho l'esame a breve .......

Redvex
01-03-2011, 11:17
Stesso mio problema
potresti usare (DATEDIFF (hh, P.oraFine, P.oraInizio))>3 ma a me poi non funziona il confronto con un integer (>,< etc) Non capisco il perchè dato che la funzione ritorna un integer.
Vedi se magari ti va o se da l'errore scrivi come hai corretto perchè il debug di libreoffice è abbastanza criptico sugli errori :(

Gin&&Tonic
01-03-2011, 11:23
ma io sto usando Sql , non mySql , "DateDiff " va bene anche per Sql??

Comunque mi da errore.... sto leggendo un libro intero ma non da un cazz di chiarimento per confrontare due orari ....

Grazie comunque ;)

Redvex
01-03-2011, 11:32
ma io sto usando Sql , non mySql , "DateDiff " va bene anche per Sql??

Comunque mi da errore.... sto leggendo un libro intero ma non da un cazz di chiarimento per confrontare due orari ....

Grazie comunque ;)

è un comando sql non di mysql prova a stampare il risultato che ti ritorna senza usare il paragone.
A me ritorna i giorni giusti.

Dânêl
01-03-2011, 11:40
Nel caso di Gin&&Tonic datediff non dovrebbe andare bene perchè restituisce la differenza delle componenti data, mentre a te interessa la differenza di orario.
Dovresti quindi usare timediff() (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediff) che ritorna il tipo time. Utilizzando, poi, la funzione hour() estrai come intero le ore di differenza e puoi finalmente verificare se è maggiore o uguale a 3

Redvex
01-03-2011, 11:51
Nel caso di Gin&&Tonic datediff non dovrebbe andare bene perchè restituisce la differenza delle componenti data, mentre a te interessa la differenza di orario.
Dovresti quindi usare timediff() (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediff) che ritorna il tipo time. Utilizzando, poi, la funzione hour() estrai come intero le ore di differenza e puoi finalmente verificare se è maggiore o uguale a 3

Ma perchè datediff non permette di fare un confronto con degli operatori? Pur leggendo che ritorna un integer?

Dânêl
01-03-2011, 11:59
Non ho qui installato un server mysql per fare delle prove.
Prova a postare la query completa ed eventualmente l'errore che ti viene restituito. Magari il problema sta altrove

Gin&&Tonic
01-03-2011, 13:12
Danel scusa ma non ho capito come dovrei fare : allora io ho questo schema relazionale:

• Evento (Data, Città, Nome)
• Musicista (Nome, Età, Città)
• Partecipazione (Musicista, Evento, OraInizio, OraFine, Ruolo, CompensoOrario)

E devo formulare la seguente interrogazione in SQL:
-Per ogni musicista, il numero di partecipazioni di durata maggiore di 3 ore (NB: per durata di una partecipazione, si intende la differenza tra l’orario di fine e l’orario di inizio);

Ho cosi formulato l'interrogazione:

Select P.musicista , count(*)
From Partecipazione P
where ( P.oraFine - P.oraInizio > 3 ore )
Group by P.musicista

cosa dovrei mettere al posto di " P.oraFine - P.oraInizio > 3 ore" ?
non ho capito come applicare quei "metodi"...

Grazie

Dânêl
01-03-2011, 14:13
Select P.musicista , count(*)
From Partecipazione P
where HOUR ( TIMEDIFF(P.oraFine,P.oraInizio) ) >= 3
Group by P.musicista


Non l'ho provata ma dovrebbe funzionare. Se eventualmente devi escludere gli spettacoli che durano esattamente 3 ore 0 minuti e 0 secondi allora devi aggiungere qualche altra condizione nel where utilizzando le funzioni relative per estrarre i minuti ed i secondi dal campo data