Ver Mensaje Individual
  #5  
Antiguo 21-01-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Ahi tienes que usar es funciones de fecha, no de numero.
Efectivamente, pero es que en algún sitio había visto que se podía usar el SUM sobre valores de tiempo.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Seguro que es dialecto 3?
La definición de la BB.DD. está puesta así:
Código SQL [-]
Ocio->Connected               = false;
Ocio->DatabaseName            = "Tablas\\Ocio.fdb";
Ocio->SQLDialect              = 3;
Ocio->Params->Clear();
Ocio->Params->Add("USER 'sysdba'");
Ocio->Params->Add("PASSWORD 'masterkey'");
Ocio->Params->Add("PAGE_SIZE 4096");
Ocio->Params->Add("DEFAULT CHARACTER SET ISO8859_1 COLLATION ES_ES_CI_AI");
Ocio->CreateDatabase();
Así que sí, es dialecto 3.
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Yo optaría por guardar internamente los tiempos en segundos (en BD).
Luego a la hora de pintarlos sólo tienes que pasarlos a horas, minutos y segundos. Es una cuestión de visualización.

De esa forma puedes usar la funciones tipo SUM sin problemas.
Es una alternativa que no se me había ocurrido pero te obliga a decodificar el tiempo para poder guardarlo en segundos con lo cual al final tienes el mismo trabajo; he optado por el segundo query de mi mensaje (SUM(EXTRACT(HOUR FROM Tiempo)) Hora) y queda así el código:
Código:
int Hora, Minuto, Segundo;

Query->Close();
Query->SQL->Text = "SELECT Disco, SUM(EXTRACT(HOUR FROM Tiempo)) Hora, 
                                  SUM(EXTRACT(MINUTE FROM Tiempo)) Minuto, 
                                  SUM(EXTRACT(SECOND FROM Tiempo)) Segundo 
                      FROM Pistas GROUP BY Disco ORDER BY Disco";
Query->Open();

for (; !Query->Eof; Query->Next())
{
     Segundo = Query->FieldByName("Segundo")->AsInteger % 60;
     Minuto = Query->FieldByName("Minuto")->AsInteger + (int)Query->FieldByName("Segundo")->AsInteger / 60;
     Hora = Query->FieldByName("Hora")->AsInteger + (int)Query->FieldByName("Minuto")->AsInteger / 60;
     Minuto = Minuto % 60;
     [...]
}
Muchas gracias por todas vuestras sugerencias.
Responder Con Cita