Help Sql somma orari

le clausole where devono essere uguali nelle due query, altrimenti il rischio é quello di ottenere totali differenti dalla lista degli elementi, quindi meglio definire 1 sola variabile e 1 sola array

questo x verifica
PHP:
<?php
error_reporting(-1);

require_once 'myUtils/show_vars.php';

$data_da           = "2023-01-02";
$data_a            = "2023-01-22";
$componente        = 123456789;
$stampo            = "stampo1";
$analisi           = "analisi1";
$tipo_manutenzione = "tipo_manutenzione1";


$query_dinamica = "";
$parametri = array();

if (($data_da != "" ) && ($data_a != "" )) {
    $query_dinamica .= " and (data_intervento BETWEEN ? and ?)";
    $parametri[] = $data_da;
    $parametri[] = $data_a;
}

if ($componente != "" )  {
    $query_dinamica .= " and id_parte_intervento = ?";
    $parametri[] = $componente;
}

if ($stampo != "" )  {
    $query_dinamica .= " and id_stampo_intervento = ?";
    $parametri[] = $stampo;
}

if ($analisi != "" )  {
    $query_dinamica .= " and id_analisi_p_l = ?";
    $parametri[] = $analisi;
}
 
if ($tipo_manutenzione != "" )  {
    $query_dinamica .= " and id_tipo_intervento = ?";
    $parametri[] = $tipo_manutenzione;
}

$sql2 = "SELECT * FROM ( "
      . "SELECT 1 AS posizione,"
      . "I.id_intervento,"
      . "I.id_op_intervento,"
      . "I.id_stampo_intervento,"
      . "I.id_analisi_p_l,"
      . "I.stato_intervento,"
      . "I.data_intervento,"
      . "I.durata_intervento,"
      . "dipendenti.cognome_dipendente,"
      . "dipendenti.nome_dipendente,"
      . "stampi.part_number_macchina,"
      . "stampi.descrizione_macchina,"
      . "causale_intervento.descr_causale,"
      . "componenti_stampi.descrizione_componente,"
      . "tipo_manutenzione.descr_tipo_manutenzione,"
      . "analisi_p_livello.descrizione "
      . "from interventi AS I "
      . "LEFT JOIN dipendenti ON I.id_op_intervento=dipendenti.id_dipendente "
      . "LEFT JOIN stampi ON I.id_stampo_intervento=stampi.id_macchina "
      . "LEFT JOIN causale_intervento ON I.id_causale_intervento=causale_intervento.id_causale "
      . "LEFT JOIN componenti_stampi ON I.id_parte_intervento=componenti_stampi.id_componente "
      . "LEFT JOIN tipo_manutenzione ON I.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione "
      . "LEFT JOIN analisi_p_livello ON I.id_analisi_p_l=analisi_p_livello.id_valore "
      . "where 1=1 " . $query_dinamica

      . " UNION ALL"
       
      . " SELECT 2 AS posizione,"
      . " count(*) as id_intervento,"
      . " ' ' as data_intervento,"
      . " ' ' as id_op_intervento,"
      . " ' ' as id_stampo_intervento,"
      . " ' ' as id_analisi_p_l,"
      . " ' ' as stato_intervento,"          
      . " SEC_TO_TIME(SUM(TIME_TO_SEC(F.durata_intervento))) AS tot_durata,"
      . " ' ' as cognome_dipendente,"
      . " ' ' as nome_dipendente,"
      . " ' ' as part_number_macchina,"
      . " ' ' as descrizione_macchina,"
      . " ' ' as descr_causale,"
      . " ' ' as descrizione_componente,"
      . " ' ' as descr_tipo_manutenzione,"
      . " ' ' as descrizione "
      . "from interventi AS F "
      . "LEFT JOIN dipendenti ON F.id_op_intervento=dipendenti.id_dipendente "
      . "LEFT JOIN stampi ON F.id_stampo_intervento=stampi.id_macchina "
      . "LEFT JOIN causale_intervento ON F.id_causale_intervento=causale_intervento.id_causale "
      . "LEFT JOIN componenti_stampi ON F.id_parte_intervento=componenti_stampi.id_componente "
      . "LEFT JOIN tipo_manutenzione ON F.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione "
      . "LEFT JOIN analisi_p_livello ON F.id_analisi_p_l=analisi_p_livello.id_valore "
      . " where 1=1 ". $query_dinamica . ")t ORDER BY posizione";

echo "<h3>parametri</h3>".show_var( $parametri )."<br />";

echo $query_dinamica;

//echo $sql2;

//    $query2 = $dbh -> prepare($sql2);                                  
//    $query2->execute($parametri);
//    $results2=$query2->fetchAll(PDO::FETCH_OBJ);

die;

1674468036683.png
 
Ultima modifica:
ti conviene modificare le "if" in questo modo

PHP:
if (!empty($data_da) && !empty($data_a)) {

perché se una voce non é definita, questo é il risultato
PHP Notice: Undefined variable: componente in C:\We.......
 
Buongiorno Marino, ho modificato tutto come mi hai suggerito, ma niente da fare... e non riesco davvero a capire il motivo. Le variabili sono valorizzate, se eseguo la query senza parametri (1=1) funziona tutto correttamente, nel momento in cui inserisco un parametro, non ne vuol sapere. La query che viene prodotta è la seguente (stampata con echo):
PHP:
SELECT * FROM ( SELECT 1 AS posizione,I.id_intervento,I.id_op_intervento,I.id_stampo_intervento,
               I.id_analisi_p_l,I.stato_intervento,I.data_intervento,I.durata_intervento,
               dipendenti.cognome_dipendente,dipendenti.nome_dipendente,
               stampi.part_number_macchina,stampi.descrizione_macchina,
               causale_intervento.descr_causale,componenti_stampi.descrizione_componente,
               tipo_manutenzione.descr_tipo_manutenzione,analisi_p_livello.descrizione
               from interventi AS I
               LEFT JOIN dipendenti ON I.id_op_intervento=dipendenti.id_dipendente
               LEFT JOIN stampi ON I.id_stampo_intervento=stampi.id_macchina
               LEFT JOIN causale_intervento ON I.id_causale_intervento=causale_intervento.id_causale
               LEFT JOIN componenti_stampi ON I.id_parte_intervento=componenti_stampi.id_componente
               LEFT JOIN tipo_manutenzione ON I.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione
               LEFT JOIN analisi_p_livello ON I.id_analisi_p_l=analisi_p_livello.id_valore
               where 1=1 and (data_intervento BETWEEN ? and ?)
               UNION ALL
               SELECT 2 AS posizione, count(*) as id_intervento, ' ' as data_intervento,
               ' ' as id_op_intervento, ' ' as id_stampo_intervento, ' ' as id_analisi_p_l,
               ' ' as stato_intervento, SEC_TO_TIME(SUM(TIME_TO_SEC(F.durata_intervento))) AS tot_durata,
               ' ' as cognome_dipendente, ' ' as nome_dipendente, ' ' as part_number_macchina,
               ' ' as descrizione_macchina, ' ' as descr_causale, ' ' as descrizione_componente,
               ' ' as descr_tipo_manutenzione, ' ' as descrizione
               from interventi AS F
               LEFT JOIN dipendenti ON F.id_op_intervento=dipendenti.id_dipendente
               LEFT JOIN stampi ON F.id_stampo_intervento=stampi.id_macchina
               LEFT JOIN causale_intervento ON F.id_causale_intervento=causale_intervento.id_causale
               LEFT JOIN componenti_stampi ON F.id_parte_intervento=componenti_stampi.id_componente
               LEFT JOIN tipo_manutenzione ON F.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione
               LEFT JOIN analisi_p_livello ON F.id_analisi_p_l=analisi_p_livello.id_valore
               where 1=1 and (data_intervento BETWEEN ? and ?))t ORDER BY posizione

 $query2 = $dbh -> prepare($sql2);                                     
   $query2->execute($parametri);
   $results2=$query2->fetchAll(PDO::FETCH_OBJ);

sembrerebbe tutto ok. Se faccio l'echo della variabile vedo i dati 2023-01-01/2023-01-10 ma la mia tabella rimane vuota.

Tabella:

HTML:
                     <td><?php  echo htmlentities($row2->part_number_macchina);?></td>
                    <td><?php  echo htmlentities($row2->descrizione_macchina);?></td>
                    <td><?php  echo htmlentities($row2->descr_causale);?></td>
                    <td><?php  echo htmlentities($row2->descrizione_componente);?></td>
                    <td><?php  echo htmlentities($row2->descr_tipo_manutenzione);?></td>
                    <td><?php  echo htmlentities($row2->data_intervento);?></td>
                    <td><?php  echo htmlentities($row2->durata_intervento);?></td>
                    <td><?php  echo htmlentities($row2->descrizione);?></td>
                    <td><?php  echo htmlentities($row2->stato_intervento);?></td>
                    <td><?php  echo htmlentities($row2->esito_intervento);?></td>

Non mi va di romperti le scatole continuamente, di solito non lo faccio... ma ora è una questione di principio... Se hai tempo....help me

Grazie infinite
E
 
prova sostituendo ed inserendo i valori direttamente nella query (tra apici)

data_intervento BETWEEN ? and ?

con

data_intervento BETWEEN '2023-01-01' and '2023-01-10'

guarda anche se c'é qualche messaggio nel log di php

ps, esito_intervento non é nella query

se poi ti é possibile estrai alcuni dati significativi e mandali
 
prova sostituendo ed inserendo i valori direttamente nella query (tra apici)

data_intervento BETWEEN ? and ?
Se sostituisco alla query dinamica i valori come da te suggerito funziona perfettamente. C'è qualcosa che non va nei parametri, ma onestamente sto per perdere le speranze (anche se mi rode). Il log non mi da nessuna anomalia.
if (($data_da != "" ) && ($data_a != "" )) { $query_dinamica .= " and (data_intervento BETWEEN ? and ?)"; $parametri[] = $data_da; $parametri[] = $data_a; } if ($componente != "" ) { $query_dinamica .= " and id_parte_intervento = ?"; $parametri[] = $componente; } if ($stampo != "" ) { $query_dinamica .= " and id_stampo_intervento = ?"; $parametri[] = $stampo; } if ($analisi != "" ) { $query_dinamica .= " and id_analisi_p_l = ?"; $parametri[] = $analisi; } if ($tipo_manutenzione != "" ) { $query_dinamica .= " and id_tipo_intervento = ?"; $parametri[] = $tipo_manutenzione; }
Scrivendo i parametri in questo modo non mi funziona proprio niente... UFFFFFF... che dici abbandono? faccio a meno di questa ricerca? o possiamo provare altro? onestamente sto nel pallone!!!!
ps, esito_intervento non é nella query
Si lo sapevo, ma questo al momento è l'ultimo dei problemi...

Se hai ancora un po di pazienza sono qui...altrimenti ti ringrazio comunque infinitamente.

E
 
data_intervento BETWEEN '2023-01-01' and '2023-01-10'
hai scritto che così funziona

ora prova così
"and data_intervento BETWEEN '" . $data_da . "' and '" . $data_a . "'"

stampa la query e vediamo che sia scritta bene
 
data_intervento BETWEEN '2023-01-01' and '2023-01-10'
hai scritto che così funziona

ora prova così
"and data_intervento BETWEEN '" . $data_da . "' and '" . $data_a . "'"

stampa la query e vediamo che sia scritta bene
Avevo già provato...e se non ricordo male funzionava...ma non ne sono certo (ho fatto centinaia di test),appena rientro faccio un test e ti aggiorno con l'output. Grazie infinite
 
Cosi funziona.

PHP:
 if (!empty($data_da) && !empty($data_a)) {
      $query_dinamica.=" and data_intervento between '". $data_da."' and '". $data_a."'";
      $parametri[] = $data_da;
      $parametri[] = $data_a;
      echo '<script>alert("data")</script>';    
  }

Query stampata:

SQL:
SELECT * FROM ( SELECT 1 AS posizione,
I.id_intervento,
I.id_op_intervento,
I.id_stampo_intervento,
I.id_analisi_p_l,
I.stato_intervento,
I.data_intervento,
I.durata_intervento,
dipendenti.cognome_dipendente,
dipendenti.nome_dipendente,
stampi.part_number_macchina,
stampi.descrizione_macchina,
causale_intervento.descr_causale,
componenti_stampi.descrizione_componente,
tipo_manutenzione.descr_tipo_manutenzione,
analisi_p_livello.descrizione
from interventi AS I
LEFT JOIN dipendenti ON I.id_op_intervento=dipendenti.id_dipendente
LEFT JOIN stampi ON I.id_stampo_intervento=stampi.id_macchina
LEFT JOIN causale_intervento ON I.id_causale_intervento=causale_intervento.id_causale
LEFT JOIN componenti_stampi ON I.id_parte_intervento=componenti_stampi.id_componente
LEFT JOIN tipo_manutenzione ON I.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione
LEFT JOIN analisi_p_livello ON I.id_analisi_p_l=analisi_p_livello.id_valore where 1=1 and data_intervento between '2023-01-01' and '2023-01-06'
UNION ALL
SELECT 2 AS posizione, count(*) as id_intervento,
 ' ' as data_intervento,
' ' as id_op_intervento,
 ' ' as id_stampo_intervento,
' ' as id_analisi_p_l,
' ' as stato_intervento,
 SEC_TO_TIME(SUM(TIME_TO_SEC(F.durata_intervento))) AS tot_durata,
 ' ' as cognome_dipendente,
' ' as nome_dipendente,
' ' as part_number_macchina,
' ' as descrizione_macchina,
' ' as descr_causale,
' ' as descrizione_componente,
' ' as descr_tipo_manutenzione,
' ' as descrizione
from interventi AS F
LEFT JOIN dipendenti ON F.id_op_intervento=dipendenti.id_dipendente
LEFT JOIN stampi ON F.id_stampo_intervento=stampi.id_macchina
LEFT JOIN causale_intervento ON F.id_causale_intervento=causale_intervento.id_causale
LEFT JOIN componenti_stampi ON F.id_parte_intervento=componenti_stampi.id_componente
LEFT JOIN tipo_manutenzione ON F.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione
LEFT JOIN analisi_p_livello ON F.id_analisi_p_l=analisi_p_livello.id_valore
where 1=1 and data_intervento between '2023-01-01' and '2023-01-06')t ORDER BY posizione
 
Ultima modifica di un moderatore:
ora sostituisci così

PHP:
 if (!empty($data_da) && !empty($data_a)) {
      $query_dinamica.=" and data_intervento between ? and ? ";
      $parametri[] = $data_da;
      $parametri[] = $data_a;
      echo '<script>alert("data")</script>';    
  }

ed esegui con

PHP:
$query2 = $dbh -> prepare($sql2);                                    
$query2->execute($parametri);
$results2=$query2->fetchAll(PDO::FETCH_OBJ);

ps stampa la query e var_dump dei parametri
 
ps stampa la query e var_dump dei parametri
Var_dump array:
Codice:
array(2) { [0]=> string(10) "2023-01-01" [1]=> string(10) "2023-01-26" }

Query:
SQL:
SELECT * FROM ( SELECT 1 AS posizione,I.id_intervento,I.id_op_intervento,I.id_stampo_intervento,I.id_analisi_p_l,I.stato_intervento,I.data_intervento,I.durata_intervento,dipendenti.cognome_dipendente,dipendenti.nome_dipendente,stampi.part_number_macchina,stampi.descrizione_macchina,causale_intervento.descr_causale,componenti_stampi.descrizione_componente,tipo_manutenzione.descr_tipo_manutenzione,analisi_p_livello.descrizione from interventi AS I LEFT JOIN dipendenti ON I.id_op_intervento=dipendenti.id_dipendente LEFT JOIN stampi ON I.id_stampo_intervento=stampi.id_macchina LEFT JOIN causale_intervento ON I.id_causale_intervento=causale_intervento.id_causale LEFT JOIN componenti_stampi ON I.id_parte_intervento=componenti_stampi.id_componente LEFT JOIN tipo_manutenzione ON I.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione LEFT JOIN analisi_p_livello ON I.id_analisi_p_l=analisi_p_livello.id_valore where 1=1 and data_intervento between ? and ? UNION ALL SELECT 2 AS posizione, count(*) as id_intervento, ' ' as data_intervento, ' ' as id_op_intervento, ' ' as id_stampo_intervento, ' ' as id_analisi_p_l, ' ' as stato_intervento, SEC_TO_TIME(SUM(TIME_TO_SEC(F.durata_intervento))) AS tot_durata, ' ' as cognome_dipendente, ' ' as nome_dipendente, ' ' as part_number_macchina, ' ' as descrizione_macchina, ' ' as descr_causale, ' ' as descrizione_componente, ' ' as descr_tipo_manutenzione, ' ' as descrizione from interventi AS F LEFT JOIN dipendenti ON F.id_op_intervento=dipendenti.id_dipendente LEFT JOIN stampi ON F.id_stampo_intervento=stampi.id_macchina LEFT JOIN causale_intervento ON F.id_causale_intervento=causale_intervento.id_causale LEFT JOIN componenti_stampi ON F.id_parte_intervento=componenti_stampi.id_componente LEFT JOIN tipo_manutenzione ON F.id_tipo_intervento=tipo_manutenzione.id_tipo_manutenzione LEFT JOIN analisi_p_livello ON F.id_analisi_p_l=analisi_p_livello.id_valore where 1=1 and data_intervento between ? and ? )t ORDER BY posizione

Tutto assurdo... è la prima volta che mi incarto per una cosa del genere. Ho sempre effettuato query per range di date, ma le query erano molto più semplici e gestibili.... Ora mi sono perso definitivamente...
 
mi sembra che la query e relativi parametri sia giusta,
manca
I.data_intervento between ? and ?
ma il campo pare essere univoco altrimenti darebbe errore,

prova a controllare bene gli errori e vedi che ci sia
error_reporting(-1);
 

Discussioni simili