[PHP] sommare le ore

ste80

Nuovo Utente
25 Feb 2012
38
0
6
39
Brescia
Buonasera,
io avrei la necessità di sommare delle ore contenute nel mio DB che sono state inserite anticipatamente (per archiviarle uso il formato TIME) e per sommarle uso :
PHP:
$q = mysql_query("SELECT SUM(ore) AS somma_ore FROM `".$tabella."`");
$r = mysql_fetch_array ($q);

echo "la somma delle ore e': &nbsp";
echo $r['somma_ore'];
solo che così facendo mi viene perso il formato orario, allego un immagine per fare chiarezza.
Immagine.png

io però vorrei che mi apparisse
somma delle ore è 01:35:00
somma straordinarie: 0
somma permessi: 00:30:00
Come posso fare???
grazie
Stefano
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
dovresti considerare che stai sommando ore, minuti e secondi non pere o mele quindi in ms sql io scrivo così
PHP:
SELECT
sum(
             DATEPART(SECOND, [valore])
    + 60   * DATEPART(MINUTE, [valore])
    + 3600 * DATEPART(HOUR,   [valore])
)
'somma_ore'
FROM myTime
lascio a te la conversione nel linguaggio specifico del db che stai usando

il tuo esempio da come risultato 5700 secondi che puoi convertire con modi diversi, ne elenco 3,
PHP:
$r['somma_ore']=5700;
echo sprintf('%02d:%02d:%02d', ($r['somma_ore']/3600),($r['somma_ore']/60%60), $r['somma_ore']%60)."<br />";
echo date('H:i:s', mktime(0, 0, $r['somma_ore']))."<br />";
echo gmdate("H:i:s", $r['somma_ore'])."<br /><br />";
upload_2017-7-20_13-33-41.png
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao #marino
il tuo ragionamento è perfetto solo e se nel db le ore sono nel formato hh:ii:ss, ma dato che già ste80 dalla somma SUM(ore) ottiene es. 9500 probabilmente vuol dire che le ore sono già espresse in secondi (timestamp?) quindi la tua query non serve, mentre per le conversioni un metodo vale l'altro
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
ciao #marino
il tuo ragionamento è perfetto solo e se nel db le ore sono nel formato hh:ii:ss, ma dato che già ste80 dalla somma SUM(ore) ottiene es. 9500 probabilmente vuol dire che le ore sono già espresse in secondi (timestamp?) quindi la tua query non serve, mentre per le conversioni un metodo vale l'altro
hai sicuramente ragione,

ho solo usato il suo esempio, 30 + 15 + 10 + 40 = 95 minuti ovvero 1 h e 35 min che in secondi sono 5700 !!!

ma al solito, ho poche idee e ben confuse e una vale l'altra ....
 
Ultima modifica:

ste80

Nuovo Utente
25 Feb 2012
38
0
6
39
Brescia
Rieccomi. Innanzitutto grazie a tutti per le risposte.
deve esserci qualcosa che mi sfugge perché usando i modi che avete descritto mi stampa una cosa errata, il tempo deve essere espresso in minuti.
Ho fatto un esempio dove inserisco due giorni da 00:30:00 (quindi 30 minuti) essendo due giorni totale 01:00:00 (un'ora)

Immagine.png


ho utilizzato i metodi descritti:
PHP:
$q = mysql_query("SELECT SUM(ore) AS somma_ore FROM `".$tabella."`");
$r = mysql_fetch_array ($q);

echo "<br>";
echo "<br>";
echo "la somma delle ore e': &nbsp";
echo $r['somma_ore'];
echo "<br>";

echo gmdate("H:i:s", $r['somma_ore'])."<br /><br />";
echo date('H:i:s', mktime(0, 0, $r['somma_ore']))."<br />";
echo sprintf('%02d:%02d:%02d', ($r['somma_ore']/3600),($r['somma_ore']/60%60), $r['somma_ore']%60)."<br />";
ma non capisco perché mi restituisce 01:40:00 da dove prende i 40 minuti???? devo cambiare qualcosa nel DB???
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
non mi sembra che tu abbia applicato i metodi proposti, c'è molta differenza tra le due versioni
PHP:
SELECT SUM(ore)

SELECT
sum(
             DATEPART(SECOND, [valore])
    + 60   * DATEPART(MINUTE, [valore])
    + 3600 * DATEPART(HOUR,   [valore])
)
per capire cosa cambiare sarebbe necessario verificare l'intera applicazione,
ma credo sia giusto correggere degli errori nel forum, non fornire sempre un'applicazione "gratuitamente"
se ritieni di non avere le conoscenza sufficienti, forse è meglio rivolgersi a professionisti che garantiscano
qualità, durata, sicurezza e ... qualche certezza dei risultati
at salut
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
per tagliare la testa al toro speficha esattamente come sono salvate le ore nel db, se sono espresse es. 13:26:33 va bene quanto detto da marino51 che ti da la somma in secondi, poi per trasformare i secondi in minuti basta che tu divida per 60 e arrotondare in più o in meno o troncare se non ti interessano i decimali
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
@borgo italia
ciao
per tagliare la testa al toro speficha esattamente come sono salvate le ore nel db, se sono espresse es. 13:26:33 va bene quanto detto da marino51 che ti da la somma in secondi, poi per trasformare i secondi in minuti basta che tu divida per 60 e arrotondare in più o in meno o troncare se non ti interessano i decimali
spero sia solo un esercizio, non vorrei essere l'azienda che si ritrova questo sviluppo ...
 

ste80

Nuovo Utente
25 Feb 2012
38
0
6
39
Brescia
Hai perfettamente ragione, ma ti dirò che questa è una cosa che sto facendo per me, non ho intenzione di investire niente, io uso PHP solo per il mio divertimento e per mia passione, lo so che ho molte lacune e nonostante essendo laureato in informatica non ho mai avuto modo di utilizzare questo o altri linguaggi di programmazione però mi appassiona il PHP e l'unico modo per apprenderlo è studiarlo, se non ci arrivo chiedo aiuto, tutto qua.
Ho trovato questo forum sul quale ho fatto 25 post in 5 anni (consigli che mi sono stati sempre d'aiuto) perché sebbene io sia una persona che prova e riprova prima di abbandonare l'idea domando e cerco sempre di fare domande più specifiche possibile non sono uno che chiede: mi fareste un programma PHP per le gestione ore del mio cartellino?
poi
"se ritieni di non avere le conoscenza sufficienti.
ovvio che non le ho se devo domandare.....
se questo programma funziona come voglio sono contento per me o massimo per mia moglie, se non va pace, non ho obblighi con nessuno, nemmeno fornisco applicazioni a nessuno privati o aziende è solo per sapere dove sbaglio, poi se sono di coccio che ci devo fare?
Se questo è un forum solo per professionisti del settore mi scuso e me ne vado, le mie domande sicuramente sono banali per voi ma per me non lo sono.
Ripeto non sviluppo per aziende o per privati o per nessuno, solo per me per la mia voglia di conoscere.
Detta questa premessa (mi sembrava dovuta) domani provo le modifiche consigliatemi, intanto vi ringrazio.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao ragazzi
allora questo non è il posto per discussioni filosofiche
ste80 ha tutto il diritto di chiedere, marino51 ha tutto il diritto di ripondere "tecnicamente" o di non rispondere e il tutto si ferma li, il resto è superfluo.
quindi se volete continuare la discussione tecnica ok, altrimenti chiudo la discussione
 

ste80

Nuovo Utente
25 Feb 2012
38
0
6
39
Brescia
Buongiorno,
dunque, le ore nel DB sono espresse es. 00:30:00 ho modificato la query
PHP:
$r =  mysql_query("

SELECT

sum(
             DATEPART(SECOND, [ore])
    + 60   * DATEPART(MINUTE, [ore])
    + 3600 * DATEPART(HOUR,   [ore])
)
'somma_ore'
FROM `".$tabella."`
");

echo "<br>";
echo "<br>";
echo "la somma delle ore e': &nbsp";
echo $r['somma_ore'];
echo "<br>";

echo gmdate("H:i:s", $r['somma_ore'])."<br /><br />";
echo date('H:i:s', mktime(0, 0, $r['somma_ore']))."<br />";
echo sprintf('%02d:%02d:%02d', ($r['somma_ore']/3600),($r['somma_ore']/60%60), $r['somma_ore']%60)."<br />";
non mi restituisce nessun errore però non ottengo i dati corretti, secondo me sbaglio il modo in cui imposto la query...
Immagine.png
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao prova a modificare la query definedo bene l'alias
Codice:
SELECT
sum(
             DATEPART(SECOND, [ore])
    + 60   * DATEPART(MINUTE, [ore])
    + 3600 * DATEPART(HOUR,   [ore])
) as  somma_ore
FROM $tabella"
e non usare qui pseudo apici

non puoi inoltre usare lo stesso nome
$r = mysql_query("....");
e qui
echo $r['somma_ore'];
poi comunque manca la lettura del record
PHP:
$riga=mysql_fetch_assoc($r);
e poi
PHP:
echo $riga['somma_ore'];//dovrebbe darti in output un numero intero e non 00:00:00
se poi proprio non funziona si può vedere di usare una query più semplice ricavando la somma via script php, ma se la query funziona è meglio
 

ste80

Nuovo Utente
25 Feb 2012
38
0
6
39
Brescia
ok, ho modificato come mi hai detto
PHP:
$r =  mysql_query("

SELECT
sum(
             DATEPART(SECOND, [ore])
    + 60   * DATEPART(MINUTE, [ore])
    + 3600 * DATEPART(HOUR,   [ore])
) as  somma_ore
FROM $tabella"
);

$riga=mysql_fetch_assoc($r);

echo "<br>";
echo "<br>";
echo "la somma delle ore e': &nbsp";
echo $riga['somma_ore'];
però mi da Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\visualizza.php on line 94 (che è la riga dove definisco $riga=mysql_fetch_assoc($r); e non mi stampa niente a video...
Immagine.png
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
allora se come ha detto le ore sono hh:mm:ss, prova così
PHP:
//.....
$r=mysql_query("SELECT ore FROM $tabella");//$babell l'hai valorizzata prima?
var_dump($r);//poi lo togli, dimmi se riporta FALSE o RESOURCE...
$somma=0;
while($riga=mysql_fetch_assoc($r)){
    $tempo=explode(":",$riga['ore']);
    $somma+=$tempo[0]*3600 + $tempo[1]*60+$tempo[2];
}
echo "ore Totali: ".date('H:i:s',$somma)."<br />";
//...
sappimi dire
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
ti ho trovato anche una soluzione usando solo una query
PHP:
<?php
/*fatta tabella tbl e inseriti
1    01:01:01
2     01:02:02
3     01:00:00
4     02:03:01
*/
$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = 'password';  //password
$db = 'prove';            // nome data base
$conn = mysqli_connect($host,$username,$password, $db) or die (mysql_error());
$r=mysqli_query($conn,"SELECT SUM(HOUR(ore)*3600) as H, SUM(MINUTE(ore)*60) as M, SUM(SECOND(ore)) as S  FROM tbl");//qui metterai il tuo $tabella
$riga=mysqli_fetch_assoc($r);
echo "ore Totali: ".date('H:i:s',($riga['H']+$riga['M']+$riga['S']))."<br />";//output ore Totali: 06:06:04 OK
?>
guarda che ho usato mysqli e non mysql e conviene anche a te passare a mysqli per non lavorare/studiare inutilmente
 

ste80

Nuovo Utente
25 Feb 2012
38
0
6
39
Brescia
eccomi, ho riportato, questo è quello che succede dopo l'inserimento...
Immagine.png


si la $tabella l'ho inizializzata nel file connessione