Translate

jueves, 21 de noviembre de 2013

SQL Server: DateTime To Float

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

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

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

No hay comentarios: