Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
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 01-11-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Sumar tiempos con SUM

Hola a todos, estoy haciendo una aplicación para el manejo de información de una pizarra telefónica que entre otras cosas debe sumar los tiempos usados por cada extensión y pasarlos a un gráfico TChart.
La BD es paradox 7 y he tratado de hacer lo siguiente:
Código:
select extension, sum(duracion) as tiempo from bdtelf
order by extension
Con esta declaración obtengo el error:
Type mismatch in expression
Como pienso que este error se debe a incongruencia entre la función SUM y lo que tiene que sumar, que son valores de un campo tipo TTimeField traté de utilizar la función CAST y acomodarlo así:
Código:
select extension, sum(cast(duracion as FLOAT)) as tiempo from bdtelf
order by extension
Pero me vuelve a aparecer el error, ¿alguna idea o ayuda de como sumar los tiempos por extensión?
Como dato adicional ellos aparecen en la tabla con formato 00:00:00
Gracias por su tiempo
Responder Con Cita
  #2  
Antiguo 01-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Después de algunos intentos me parece que no puedes convertir un campo TIMEa un campo numérico, sólo a uno de tipo caracter.

Lo único que se me ocurre ahora es convertirlo a CHAR(8), usar SUBSTRING para separar cada parte (hora, minutos y segundos) y convertirla cada una a NUMERIC. Multiplicar la parte de horas por 3600 y la parte de minutos por 60 y sumar todas las partes para obtener el número de segundos que dura cada llamada. Sobre este resultado hacer la SUM. En resumen, algo así:

Código:

select
  extension,
  sum(
    cast(substring(cast(duracion as char(8)) from 1 for 2) as numeric)*3600 +
    cast(substring(cast(duracion as char(8)) from 4 for 2) as numeric)*60 +
    cast(substring(cast(duracion as char(8)) from 7 for 2) as numeric)
  )
from
  bdtelf
group by
  extension
Por cierto, era GROUP BY en lugar de ORDER BY.

Desde luego, una vez hecha la consulta tendrías que descomponer el número de segundos en horas, minutos y segundos.

// Saludos
Responder Con Cita
  #3  
Antiguo 02-11-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
He estado desarrollando la excelente idea de Román y he llegado hasta sumar horas y minutos, lo he dejado ahí, porque me parece que el código deviene demasiado farragoso.

Código:
select
  extension,
  sum((
	 cast(substring(cast(tiempo as char(8)) from 1 for 2) as Integer)*3600 +
	 cast(substring(cast(tiempo as char(8)) from 4 for 2) as Integer)*60 +
	 cast(substring(cast(tiempo as char(8)) from 7 for 2) as Integer) 
  ) /3600) as ttHoras,

  
	  sum((
	 cast(substring(cast(tiempo as char(8)) from 1 for 2) as Integer)*3600 +
	 cast(substring(cast(tiempo as char(8)) from 4 for 2) as Integer)*60 +
	 cast(substring(cast(tiempo as char(8)) from 7 for 2) as Integer) 
  ) /60)   -

	 sum(((
	 cast(substring(cast(tiempo as char(8)) from 1 for 2) as Integer)*3600 +
	 cast(substring(cast(tiempo as char(8)) from 4 for 2) as Integer)*60 +
	 cast(substring(cast(tiempo as char(8)) from 7 for 2) as Integer) 
  ) /3600) * 60)  as ttMinutos

from 	"d:\pruebas\ruben.db"
group by
extension
Dada la casi nula posibilidad de sumar tiempos con Pardox, yo crearía una rutina, para hacer las sumas mediante un bucle, la acumulación dependiendo de los casos, pudiera ser en un StringGrid, o en una tabla creada al efecto.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 03-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Vaya marcoszorrilla! ¡Tú sí que eres atrevido!

Diste el paso que yo no me atreví a dar.

Lo que en realidad haría yo es guardar la duración de cada llamada no en un campo TIME sino en un campo NUMERIC guardando el número de milisegundos y dejaría que la aplicación se encargue de hacer las conversiones al guardar y leer. De esta forma, la consulta sería como en un principio:

Código:
SELECT
  extension,
  sum(duracion)
FROM
  bdtelf
GROUP BY
  extension
y la aplicación simplemente convertiría el resultado de la consulta al formato hh:mm:ss

// Saludos
Responder Con Cita
  #5  
Antiguo 03-11-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola roman y marcos, como estoy desarrollando la aplicación y sus tablas voy a probar (si puedo) mañana una solución que me parece que puede resolver el problema, como recibo una cadena desde la centralita que contiene toda la información de la llamada a través del puerto serie y la descompongo en subcadenas que paso al campo que corresponda voy a tomar la cadena correspondiente a la duración de la llamada y ademas de presentarla en formato 00:00:00 para el usuario, en otro campo que he creado voy a guardar ese valor como numérico (como proponía roman) y entonces es fácil aplicar la función SUM.
Problemas??
El valor almacenado como float es fracción del día y al ser mayor que '1' devuelve el tiempo como si no hubiesen acumuladas 24 horas, por ejemplo es lo mismo 0.5 que 1.5 y 2.5 siempre devuelve las 12:0:0, cuando en realidad debía ser 12:0:0, 36:0:0 y 60:0:0 eso creo que lo he resuelto con una funcioncita, así:
Código:
function TiempoUsado(totaltime:double):string;
var Hour, Min, Sec, MSec:word;
begin
DecodeTime(totaltime, Hour, Min, Sec, MSec);
result:= inttostr(hour+trunc(totaltime)*24)+':'+inttostr(min)+':'+inttostr(sec);
end;
Desde el resultado del query le paso el valor del campo SUM .
De esta manera creo que puedo superar la dificultad de no poder sumar campos TTime en paradox.
Diganme si ven alguna cosa rara, pero ha superado las primeras pruebas.
Gracias por su tiempo a ambos y
Saludos
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


La franja horaria es GMT +2. Ahora son las 12:20:10.


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