Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Risultato errato nella somma di ore in due record tramite query

    Ciao a tutti

    ho questo problema che non mi riesce di risolvere in nessuna maniera e non capisco il perche':

    ho un db con due tabelle:

    tabella 1:
    contiene un campo con ore in formato HH:MM:SS e altri tre campi giorno, mese, anno in maniera univoca (una riga per giorno), per esempio:
    ID 1 -> NOME COGNOME PINCO PALLINO -> ORE 08:30:00 -> GIORNO 02 -> MESE 01 -> ANNO 2024 -> MATRICOLA 522

    tabella 2:
    contiene un campo con ore in formato HH:MM:SS e altri tre campi giorno, mese, anno in maniera univoca ma qui puo' esserci piu' di un giorno, per esempio:
    ID 1 -> NOME COGNOME PINCO PALLINO -> ORE 08:00:00 -> GIORNO 02 -> MESE 01 -> ANNO 2024 -> MATRICOLA 522
    ID 2 -> NOME COGNOME PINCO PALLINO -> ORE 00:30:00 -> GIORNO 02 -> MESE 01 -> ANNO 2024 -> MATRICOLA 522

    dovrei, unire i risultati della tabella 1 e della tabella 2 e mostrare i risultati in questo modo:
    se arrivano dalla tabella 1, semplicemente l'orario cosi' com'e',
    se arrivano dalla tabella 2 sommare i due record e mostrare la riga con la somma delle ore

    per esempio:
    TABELLA 1 -> NOME COGNOME PINCO PALLINO -> ORE 08:30:00 -> GIORNO 02 -> MESE 01 -> ANNO 2024 -> MATRICOLA 522
    TABELLA 2 -> NOME COGNOME PINCO PALLINO -> ORE 08:30:00 -> GIORNO 02 -> MESE 01 -> ANNO 2024 -> MATRICOLA 522

    per ottenere questo effetuo una query cosi' (e creo la relativa tabella html):

    Codice PHP:

    $sql 
    "SELECT tabella, id, cognomeNome, matricola, giorno, mese, anno, ore
            FROM (
                SELECT 'tabella 1' AS tabella, id, cognomeNome, matricola, giorno, mese, anno, ore AS ore 
                FROM tabella 1
                UNION ALL
                SELECT 'tabella 2' AS tabella, id, cognomeNome, matricola, giorno, mese, anno, SUM(ore) AS ore
                FROM tabella 2
                GROUP BY matricola, giorno, mese, anno
            ) AS combined
            ORDER BY giorno, matricola"
    ;
            
    $result $connAvanzamento->query($sql);

    if (
    $result->num_rows 0) {
        
        
    // RISULTATI
        
    echo "<h2>Risultati delle due tabelle:</h2>";
        echo 
    "<table border='1'>";
        echo 
    "<tr><th>TABELLA</th><th>ID</th><th>matricola</th><th>giorno/mese/anno</th><th>ore</th></tr>";
        while(
    $row $result->fetch_assoc()) {

            echo 
    "<tr>";
            echo 
    "<td>".$row["tabella"]."</td>";
            echo 
    "<td>".$row["id"]."</td>";
            echo 
    "<td>".$row["matricola"]." - ".$row["cognomeNome"]."</td>";
            echo 
    "<td>".$row["giorno"]."/".$row["mese"]."/".$row["anno"]."</td>";
            echo 
    "<td>".$row["ore"]."</td>";
            echo 
    "</tr>";

        }
        
        echo 
    "</table>";

    } else {
        
        echo 
    "Nessun risultato trovato";

    }

    // Chiusura della connessione
    $connAvanzamento->close(); 
    la query sembra funzionare, ma il risultato che ottengo non pare corretto, per quel che riguarda la somma della tabella 2:

    Risultati delle due tabelle unite:
    TABELLA 2 - MATRICOLA COGNOME NOME -> 522 PINCO PALLINO -> 02/01/2024 -> 83000
    TABELLA 1 - MATRICOLA COGNOME NOME -> 522 PINCO PALLINO -> 02/01/2024 -> 08:30:00

    Perche' nella somma della tabella 2, il risultato che ottengo non e' in formato hh:mm:ss ?
    In realta' 83000 corrisponde a 8:30:00 ed e' corretto come come somma, e' sbagliata la formattazione.

    Come mai e come posso risolvere ?

    Grazie, ciao

  2. #2
    1. perché un problema di database viene posto in un forum php?
    2. SUM() ritorna ovviamente un numero, riformattatelo tu

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,361
    Non voglio intromettermi, ma non si sommano ore come si sommano carotte.
    8:30:00 + 0:30:00 = 09:00:00 non 8:60:00
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    badaze, non so cosa tu abbia contro le carote ma hai evidenziato un altro punto

    - ammesso che _Micky_73 stia usando MySQL
    - ammesso che _Micky_73 abbia messo le ORE in un campo TIME
    (ma perché so' tutti così tirchi nel dare info? )

    vanno usate le funzioni (1)TIME_TO_SEC e (2)SEC_TO_TIME per fare le somme degli orari (1) e riaverle formattate in uscita (2)

  5. #5
    Quote Originariamente inviata da optime Visualizza il messaggio
    badaze, non so cosa tu abbia contro le carote ma hai evidenziato un altro punto

    - ammesso che _Micky_73 stia usando MySQL
    - ammesso che _Micky_73 abbia messo le ORE in un campo TIME
    (ma perché so' tutti così tirchi nel dare info? )

    vanno usate le funzioni (1)TIME_TO_SEC e (2)SEC_TO_TIME per fare le somme degli orari (1) e riaverle formattate in uscita (2)
    Le carote fanno bene, sopratutto a inizio estate :-D

    ad ogni modo, scusa, si il campo e' TIME, e il DB e' Mysql, ho risolto appunto sommando tutto in secondi:

    Codice PHP:

    SUM
    (TIME_TO_SEC(oreTotaliArrotondate)) 
    e poi rinconvertendo tutto in hh:mm:ss:

    Codice PHP:

    $ore 
    floor($row[oreArrotondate] / 3600);
    $minuti floor(($row[oreArrotondate] % 3600) / 60);
    $secondi $row[oreArrotondate] % 60;

    $tempoFormattato sprintf('%02d:%02d:%02d'$ore$minuti$secondi); 
    Grazie 1000
    Ciao
    Ultima modifica di _Micky_73; 02-05-2024 a 12:12

  6. #6
    se fai SEC_TO_TIME(SUM(TIME_TO_SEC(colonna))) ti ritrovi la somma già in formato TIME

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.