Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-01-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Sumar tiempos

Buenas tardes. A ver si me sé explicar. Tengo esta tabla en FB 2.5:
Código SQL [-]
CREATE TABLE PISTAS (
  DISCO INTEGER NOT NULL,
  ORDEN_DISCO SMALLINT NOT NULL,
  ORDEN_PISTA SMALLINT NOT NULL,
  CANCION CHAR(255),
  INTERPRETE CHAR(60),
  TIEMPO TIME);
Creo que es bastante evidente que se trata de una BB.DD. de discos. Necesito hacer un query que me sume la duración de las pistas; algo así:
Código SQL [-]
SELECT Disco, SUM(Tiempo) FROM Pistas GROUP BY Disco ORDER BY Disco
Pero al porbar en SQL Manager me da este error:
Cita:
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Dynamic SQL Error.
Expression evaluation not supported.
Argument for SUM in dialect 3 must be numeric.
¿Cómo podría hacer ese tipo de query? ¿Bastaría con cambiar el dialecto de la BB.DD. al hacer la suma?
Ya sé que podría sacar los tres datos (hora, minutos y segundos) por separado:
Código SQL [-]
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
pero al hacer luego un EncodeTime es muy fácil que dé error porque, por ejemplo, una de las sumas saldría algo así:
Cita:
Disco: 9
Hora: 0
Minuto: 38
Segundo: 711
Responder Con Cita
  #2  
Antiguo 20-01-2022
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ahi tienes que usar es funciones de fecha, no de numero.
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 20-01-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Seguro que es dialecto 3?
¿Has mirado los datos del campo tiempo con isql? Es para ver el valor real que tiene guardado, sin máscaras.
Responder Con Cita
  #4  
Antiguo 21-01-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 21-01-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 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
  #6  
Antiguo 21-01-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cierto, estaba pensando al revés, con dialecto 3 no puedes sumar.
Responder Con Cita
  #7  
Antiguo 21-01-2022
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
Efectivamente, pero es que en algún sitio había visto que se podía usar el SUM sobre valores de tiempo.
https://firebirdsql.org/refdocs/lang...c-dateadd.html

Calculos de fechas se hacen con funciones de fecha. Siempre.
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 21-01-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La verdad es que yo me he quedado "pillado" porque no me ha funcionado las pruebas que he hecho, sin embargo:


Cita:
Tipos fecha y hora.
Tabla II.II. Tipos de datos fecha y hora en Firebird
NOMBRE TAMAÑO RANGO/PRECISIÓN DESCRIPCIÓN
DATE 32 bits con signo 01-01-100 a 31-12-9999 Fecha Ejm: 12/10/1977
TIME 32 bits sin signo 0:00:00 a 23:59:59.9999 Hora
TIMESTAMP 64 bits (2x32 bits) 1 jan 100 CE to 28 feb 32768 CE
Incluye la hora y la fecha en dos estructuras de 32 bits
Al estar todos los tipos fecha almacenados como números, es posible, realizar operaciones aritméticas. Así si a un tipo DATE le suma o resta un entero, se obtendrá una nueva fecha con el incremento o decremento en días correspondiente. Si se resta dos fechas, se obtendrá el número de días entre ellas. Si se resta dos horas, se obtendrá el número de segundos entre ellas.
Responder Con Cita
  #9  
Antiguo 21-01-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
La verdad es que yo me he quedado "pillado" porque no me ha funcionado las pruebas que he hecho, sin embargo:
Ese tipo de operaciones (sumarle o restarle a una fecha) lo hago con relativa frecuencia, por ejemplo para encontrar cuando vence un recibo a domiciliar, pero con horas no lo había hecho nunca. Y he hecho alguna prueba sobre una tabla que guarda exclusivamente tiempo; por ejemplo:
Código SQL [-]
SELECT Duracion + 1 FROM Titulos WHERE Tipo = 2 AND Disco = 589
El registro original en ese campo tiene guardado el valor 0:40:01, pero el query no devuelve nada; por lo que se ve sobre campos de tiempo no puede hacerse.
Responder Con Cita
  #10  
Antiguo 21-01-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por lo visto se puede sumar/restar valores a fechas y horas, y se puede restar fechas y devuelve los días entre ellas, pero lo que no se puede, por lo visto, es sumar fechas ni tampoco horas.

Yo habría jurado que se podía.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
restar tiempos Nostradonuts Varios 2 15-04-2011 20:09:48
Calculo de tiempos jafera Varios 9 04-11-2010 12:08:47
Sumar Tiempos en una Select Salomon Firebird e Interbase 4 09-12-2004 18:07:05
Sumar tiempos Aztaroth SQL 1 06-05-2004 19:36:37
Sumar tiempos con SUM Ruben_Cu SQL 4 03-11-2003 03:10:49


La franja horaria es GMT +2. Ahora son las 04:26:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi