La idea sería calcular la velocidad a
partir de dos campos en una tabla que contienen la distancia en km y el
tiempo invertido. El cálculo es fácil, distancia/tiempo, pero ántes
tendremos que convertir el tiempo a float.
La tabla posee por lo tanto dos campo,
uno DateTime (time) y otro float(distance). Necesitaremos hacer un CAST
del time para convertir a float, lo que nos da un número que
multiplicado por 24 serán horas, por 24*60 serán minutos, y 24*60*60
serán segundos. Así para obtener un campo que contenga la velocidad en
km/h haremos un select de la siguiente manera:
select distance,time, distance/(CAST(time AS float)*24) AS “Speed” from Table1 where CAST(time AS float)>’0′
La columna Speed contendrá el dato de la
velocidad. En el campo time hay que usar el tipo DateTime ya que
permite el casting a float, no así con el tipo Time.
Un DateTime cuyo valor sea “1900/01/01 00:00:00.000″ al hacer el cast a float devolverá 0.
La clausula where evita que dividamos por
cero, pero eliminará aquellos registros que no tengan el dato tiempo.
Para evitar eso podemos cambiar la consulta a :
select distance,time,
CASE
WHEN CAST(time AS float)>’0′ THEN distance/(CAST(time AS float)*24)
ELSE ’0′
END AS “Speed”
from Table1
CASE
WHEN CAST(time AS float)>’0′ THEN distance/(CAST(time AS float)*24)
ELSE ’0′
END AS “Speed”
from Table1
De esta manera si encontramos un time
menor o igual a cero pondremos automáticamente la velocidad a 0, en otro
caso si haremos el cálculo.
Si queremos mostrar el dato de la
velocidad con solo dos dígitos tendremos que dar la salida haciendo un
casting a decimal, para ello la consulta quedaría así:
select distance,time,
CASE
WHEN CAST(time AS float)>’0′ THEN CAST (
distance/(CAST(time AS float)*24) AS decimal (7,2) )
ELSE ’0′
END AS “Speed”
from Table1
CASE
WHEN CAST(time AS float)>’0′ THEN CAST (
distance/(CAST(time AS float)*24) AS decimal (7,2) )
ELSE ’0′
END AS “Speed”
from Table1
Por último y para evitar que el campo
time, de tipo datetime, nos devuelva un dato del tipo “1900-01-01
00:00:00.000″, tenemos que hacer una conversión, para lo cual usaremos
la función CONVERT con el valor 108, que devuelve la parte time del
campo en formato hh:mm:ss. Quedará la consulta así:
select distance, CONVERT(Char(8),time,108) As “ShortTime”,
CASE
WHEN CAST(time AS float)>’0′ THEN CAST (
distance/(CAST(time AS float)*24)
AS decimal (7,2) )
ELSE ’0′
END AS “Speed”
from Table1
CASE
WHEN CAST(time AS float)>’0′ THEN CAST (
distance/(CAST(time AS float)*24)
AS decimal (7,2) )
ELSE ’0′
END AS “Speed”
from Table1
No hay comentarios:
Publicar un comentario