Sacar diferencias con SQL

30/06/2008 - 18:17 por josseluiss | Informe spam
Buen dia a todos,

Estoy tratando de sacar la diferencia de un par de datos de la siguiente
manera:
tengo 3 campos que se llaman horaini, horafin y mtbf, lo que quiere es que
me saque la diferencia entre horaini y horafin y lo asigne a mrbf pero
necesito que el valor de horaini lo tome del row anterior algo como lo
siguiente:

Horaini horafin mtbf
08:30 08:45 XXXX
10:30 11:00 02:00

de antemano muchas gracias por sus ideas

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
30/06/2008 - 18:35 | Informe spam
"josseluiss" wrote in message
news:
Estoy tratando de sacar la diferencia de un par de datos de la siguiente
manera:
tengo 3 campos que se llaman horaini, horafin y mtbf, lo que quiere es que
me saque la diferencia entre horaini y horafin y lo asigne a mrbf pero
necesito que el valor de horaini lo tome del row anterior algo como lo
siguiente:

Horaini horafin mtbf
08:30 08:45 XXXX
10:30 11:00 02:00

de antemano muchas gracias por sus ideas



¿Dónde están los datos, en un DataTable? Lo podrías recorrer con un bucle
sacando las diferencias. En forma esquemática (porque la diferencia habrá
que calcularla como sea pertinente dependiendo de la forma en que están
codificadas las horas) quedaría más o menos asi:

for (int i=0; i<dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
if (i>0)
{
dr["mtbf"] = dr["horafin"]-dt.Rows[i-1]["horaini"];
}
else
dr["mtbf"]=0;
}
Respuesta Responder a este mensaje
#2 josseluiss
30/06/2008 - 18:58 | Informe spam
gracias por tu ayuda Alberto.

Los datos estan en una base de datos de sql server, lo que trato de hacer es
con el mismo sql sacar la informacion en una vista para usar esta vista en
Crystal reports y a su vez presentar ese reporte en una pagina asp, de
cualquier manera dejame hacer pruebas con lo que sugieres a ver si logro
hacer que funcione.



"Alberto Poblacion" wrote:

"josseluiss" wrote in message
news:
> Estoy tratando de sacar la diferencia de un par de datos de la siguiente
> manera:
> tengo 3 campos que se llaman horaini, horafin y mtbf, lo que quiere es que
> me saque la diferencia entre horaini y horafin y lo asigne a mrbf pero
> necesito que el valor de horaini lo tome del row anterior algo como lo
> siguiente:
>
> Horaini horafin mtbf
> 08:30 08:45 XXXX
> 10:30 11:00 02:00
>
> de antemano muchas gracias por sus ideas

¿Dónde están los datos, en un DataTable? Lo podrías recorrer con un bucle
sacando las diferencias. En forma esquemática (porque la diferencia habrá
que calcularla como sea pertinente dependiendo de la forma en que están
codificadas las horas) quedaría más o menos asi:

for (int i=0; i<dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
if (i>0)
{
dr["mtbf"] = dr["horafin"]-dt.Rows[i-1]["horaini"];
}
else
dr["mtbf"]=0;
}



Respuesta Responder a este mensaje
#3 Alberto Poblacion
01/07/2008 - 08:44 | Informe spam
"josseluiss" wrote in message
news:
Los datos estan en una base de datos de sql server, lo que trato de hacer
es
con el mismo sql sacar la informacion en una vista para usar esta vista en
Crystal reports y a su vez presentar ese reporte en una pagina asp, de
cualquier manera dejame hacer pruebas con lo que sugieres a ver si logro
hacer que funcione.



Vale, es que como la pregunta estaba en el grupo de ado.net en lugar de
uno de sql, pensé que los datos los tendrías cargados dentro de una de las
estructuras de ado.net.

Te propongo debajo una solución que funciona aunque no es muy rápida.
Seguro que en los grupos de sql hay algún gurú que te saca una consulta con
un precioso join o una CTE que da el resultado en una sola pasada.
He asumido que el formato en que almacenas las horas es el de "número de
segundos transcurridos desde medianoche", que se pueden guardar en forma de
INT y son fáciles de restar. Si las tienes en otro formato, tendrás que
sustituir el "-" por la oportuna función que permita restarlas.

create table prueba (
horaini int,
horafin int
)
go

insert prueba values(10, 20)
insert prueba values(30, 40)
insert prueba values(70, 90)
go

create function horaanterior(@hora int) returns int
as begin
declare @resultado int
select top 1 @resultado=horaini from prueba where horaini<@hora order by
horaini desc
return @resultado
end
go

select *, horafin-(dbo.horaanterior(horaini)) as mtbf from prueba
go
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida