Differenza tra valori sulla stessa colonna

michele.b26

Nuovo Utente
18 Dic 2008
27
0
0
Ciao a tutti, qualcuno sa darmi il codice SQL per calcolare la differenza tra due valori che si trovano sulla stessa colonna?

Mi spiego meglio: ho una tabella con i campi `cliente`, `data_fattura` e voglio sapere quanto tempo è trascorso tra una fattura e l'altra dello stesso cliente, ad esempio:

Codice:
ID_CLIENTE,  DATA_FATTURA
1            01-11-2009
1            07-11-2009
1            15-11-2009
2            15-10-2009
2            02-11-2009

e cerco il risultato:

Codice:
ID_CLIENTE,  DATA_FATTURA, GIORNI
1            01-11-2009     NULL
1            07-11-2009     6
1            15-11-2009     8
2            15-10-2009     NULL
2            02-11-2009     18

Ho provato anche a cercare in internet, ma non trovo la soluzione.

Grazie per ogni eventuale risposta.
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
se si inserissero i valori di data fattura già in timestamp sarebbe tutto molto piu semplice
in time stamp l'ordinamento per data diventa sempre giusto
io ti do la soluzione per time stamp

$query1=mysql_query("SELECT* FROM clienti ORDER BY id_cliente, data_fattura")
while($riga1=misql_fetch_array($query1)){
$id_c1=$riga['id_cliente'];
$data_f1=$riga['data_fattura'];
echo "$id_cl1 $data_f1<br>";
$query2=mysql_query("SELECT* FROM clienti WHERE data_fattura > $data_f1 ORDER BY id_cliente, data_fattura")
while($riga2=mysql_fetch_array($query2)){
$id_c2=$riga['id_cliente'];
$data_f2=$riga['data_fattura'];
/*qui calcoli da differnza
$gg_dif=($data_f2-$data_f1)/(24*60*60);
con gli opportuni aggiornamenti
*/
echo "$id_cl $data_f $gg_diff<br>";
}//fine while interno
}//fine while esterno

dovrebbe risultare così

ID_CLIENTE, DATA_FATTURA
1 01-11-2009
1 07-11-2009 6
1 15-11-2009 8
2 15-10-2009
2 02-11-2009 17

comunque USA il timestamp per le date le trasformi poi a video come ti pare, anze se fai due fatture
allo stesso cliente nello stesso giorno le fatture hanno tempi diversi in quanto il timestamp conta i secondi
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
il problema non è quello, ma se nella tabella le date sono inserite gg-mm-aaaa succede che la data 01-12-2009 viene prima di 12-10-2009 dando orderby, mentre se inserisco la data in timestamp anche sel ho due date dellestesso giorno, possono essere della stessa ora e minuto, ma è estremamete difficile che siano dello stesso secondo (casomai uso microtime) e cosi sono sicuro che order by funzi esattamente come dovrebbe
 

michele.b26

Nuovo Utente
18 Dic 2008
27
0
0
Ehm, intendevo una soluzioni in SQL, scusate l'imprecisione, io ho scritto questo codice:

Codice:
select t1.id_cliente, t1.data_fattura, DATEDIFF(t2.data_fattura, t1.data_fattura) as differenza_giorni
from tabella as t1, tabella as t2
where t2.data_fattura > t1.data_fattura
and t1.id_cliente = t2.id_cliente
group by t1.data_fattura
order by t1.id_cliente, t1.data_fattura

Però non ne sono convinto al 100% e non mi restituisce i 'null'.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
non sono molto esperto in mysql, per quello ti ho suggerito la via "software".
forse non sfrutterò al massimo le potenzialità di mysql, però è la strada che preferisco tenendo le query le più semplici e lineari possibile.
quindi non so dirti perche la tua quary non funzi. spera che qualcuno più esperto ti sappia rispondere
 

michele.b26

Nuovo Utente
18 Dic 2008
27
0
0
Apprezzo anche la tua linea, ma per questo problema devo usare proprio il SQL, grazie lo stesso per l'aiuto. Altri suggerimenti?
 

michele.b26

Nuovo Utente
18 Dic 2008
27
0
0
Un'idea potrebbe essere quella di affiancare al campo data un'altra colonna con le date shiftate di uno, cioè creare una coppia con data e la data immediatamente successiva, per poi calcolarne la differenza, ma come si fa?

Codice:
ID_CLIENTE,  DATA_FATTURA,  DATA_FATTURA_2
1            01-11-2009     NULL
1            07-11-2009     01-11-2009
1            15-11-2009     07-11-2009
2            15-10-2009     NULL
2            02-11-2009     15-10-2009
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
intanto non capisco perche tu voglia appesantire il db effetuando query complicate o aggiungendo colonne inutili,
ma ogniuno ha un suo stile.
comunque volevo segnalarti che il campo DATA_FATTURA, per fare quello che dici, deve essere ordinato in
ordine crescente di data.
ora se hai impostato il campo tipo DATE (estratto da manuale mysql)

Una colonna DATE può contenere date da '1000-01-01' (1° gennaio 1000)
a '9999-12-31' (31 dicembre 9999).
MySQL visualizza le date nel formato che vi abbiamo appena mostrato,
ma vi consente di inserirle sotto forma di stringhe o numeri.

quindi o le date sono inserite in tale formato aaaa mm gg ho il risultato è almeno assurdo
se inserisce le date nel formato europeo gg mm aaaa diffdate calcola la differenza tra le date
considerando quello che tu credi gg come anno, per il mese ci azzecca,
per giorno quello che credi essere l'anno

oppure se le hai inserite come stringa (varchar) ricordati che nell'ordinamento che fai per data
(im dodo da evere per prima la piu vecchia) ti può capitare che se la più vecchia è il 22-01-2009 ed una successiva
15-03-2009, nell'ordinamento mette per prima quella del 15-03 poi quella del 22-01 (errato sia come
ordinamento che come base del calcolo della differenza, almeno una data diviene negativa)

come già detto, sempre secondo me, il metodo migliore è inserire le date nel formato timestamp (impostando il camdo della data
come TIMESTAM o, secondo me meglio, BLOBINT(29). (timestamp/unix secondi trascorsi dal 1°gennaio 1970 ore 00)
in questo modo:
1. sei sicuro che l'ordinamento sia sempre e comunque esatto
2. la differenza è più facilmente calcolabile (anche indicando gg:h:min:sec e decimale di secondo)
3. con date(pattern, valore_timestamp) puoi dopo visualizzare la data come vuoi (puoi scegliere tra una ventina di formati
con i separatori che preferisci)
 

michele.b26

Nuovo Utente
18 Dic 2008
27
0
0
Ho trovato la soluzione, non è mia, me l'ha passata un mio amico.

Codice:
select t1.id_cliente, t1.data_fattura, t2.data_fattura, DATEDIFF(t2.data_fattura, t1.data_fattura) as giorni_differenza 
from tabella as t1, tabella as t2 
where t1.id_cliente = t2.id_cliente 
and t1.data_fattura < t2.data_fattura 
and not exists( 
	select 1 
	from tabella as t3 
	where t3.id_cliente = t1.id_cliente 
	and t3.data_fattura > t1.data_fattura 
	and t3.data_fattura < t2.data_fattura 
);

così funziona correttamente.

Concordo con voi sul formato della data, le ho scritte in quel modo solo per rendere l'esempio più leggibile.
Concordo anche sul fatto di usare il PHP per l'interrogazione o altri linguaggi, ma per delle indagini sul db, è meglio interrogarlo direttamente in SQL, soprattutto quando si usa Pentaho, così risulta più veloce.

Grazie per l'aiuto e per lo scambio di idee.
 
Discussioni simili
Autore Titolo Forum Risposte Data
Gabriele Visioli Differenza tra hosting e hosting WordPress Hosting 4
S Differenza tra le funzioni include () e require ()? PHP 1
U [PHP] Differenza tra amministratore e utente PHP 2
M PHP Arrotondamento minuti in differenza tra due Orari PHP 9
V [PHP] Differenza reale tra bindParam e bindValue PHP 8
Z Google: qual'è la differenza tra Popolarità e Autorevolezza di un sito? SEO e Posizionamento 1
M Qual'è la differenza tra Server.Transfer e Response.Redirect? ASP.NET 1
Giacomo92 Differenza tra Webmaster e Web designer? Webdesign e Grafica 2
V Calcolare la differenza tra due date in PHP PHP 1
V Differenza tra operatori == e === in javascript? Javascript 1
felino [C#] Differenza tra ClipboardPasted e ClipboardPasting .NET Framework 2
F differenza tra 2 date PHP 5
M Calcolare differenza temporale tra datetime salvati sui records di una tabella mysql PHP 18
Monital Differenza tra int smallint etc. Database 5
A Differenza tra anteporre o posporre l'operatore di incremento nel ciclo for Javascript 5
C Differenza tra due ore PHP 17
PenguinLover Differenza tra detrazioni e deduzioni? Leggi, Normative e Fisco 3
Monital Differenza tra date PHP 8
YellowMan Differenza tra Server Virtuale e Cloud Server Cloud Computing e Cloud Server 1
M Differenza tra precision e scale PHP 2
novello88 Differenza tra include() e require() PHP 18
M [VB.Net] Che differenza c'è tra CType e DirectCast? ASP.NET 1
S Differenza tra queste righe di codice Javascript 2
S Differenza tra orari sballata! PHP 2
M Differenza tra richiesta sincrona e asincrona Ajax 0
emanuelevt differenza tra $array[]='valore' o array_push($array,'valore') PHP 2
emanuelevt differenza concreta tra array_rand e shuffle PHP 2
SolidSnake4 differenza tra sleep() e microtime() PHP 9
M Differenza tra date e countdown PHP 4
A Differenza comportamento tra click mouse e pressione tasto invio Visual Basic 0
borgo italia differenza tra applet e script? Javascript 10
I Differenza tra blog e sito Webdesign e Grafica 12
E Differenza tra utenti e hits [Era: Statistiche accessi al sito] Discussioni Varie 2
B Che differenza c'è tra un sito professionale e uno no ? Webdesign e Grafica 7
V Differenza di visualizzazione tra IE e FireFox HTML e CSS 4
S Differenza date record successivi MS Access 7
T differenza fra mysql xampp e un mysql server Database 0
Emix [PHP] Differenza Date + Ore PHP 3
S [PHP] Eseguire differenza su dati SQL presenti sulla stessa colonna PHP 1
K Certificato SSL (https) gratuito o a pagamento? che differenza c'è? Server Dedicati e VPS 1
andrea.peo Calcolo differenza fra record attivo e precedente PHP 1
G Calcolo differenza valori provenienti da una tabella PHP 0
giap Classi stili/stili per singoli TAG- differenza- HTML e CSS 2
S Differenza data PHP 1
C Ma perchè!!!! Differenza visualizzazione con iOS Safari HTML e CSS 2
Shyson Differenza UTF-8 e gli altri HTML e CSS 12
L Reale differenza con il precedente HTML HTML e CSS 1
N Con Google Crome a differenza di Explore i comandi per la musica non funzionano Javascript 0
G Differenza fra due date PHP 5
I Differenza data PHP 2

Discussioni simili