23 de julio de 2010

Convertir TimeSpan .Net a DateTime de SQL Server

El tipo de datos TimeSpan de .Net generalmente se mapea a SQL Server en forma de un long o big int, lo cual está correcto ya que SQL Server no posee un tipo de datos adhoc para representar el TimeSpan (por lo menos en 2005).
El problema surge cuando queremos convertir este los ticks guardados en base de datos a un DateTime.
Resulta que los Ticks son la representación en nanosegundos (1 paso del tick corresponde a 100 nanosegundos) de un intervalo de tiempo dado, por lo tanto si quisieramos convertir a un datetime estos valores solo debieramos agregarle a una fecha X el valor de los ticks que queremos para representar la hora. Como en SQL Server 2005, la funcion DATEADD permite solo agregar hasta milisegundos debemos los ticks a milisegundos para utilizarlos y esto lo hacemos dividiendo por 10.000 o multiplicando por 10-4 esto por que cada tick esta representado en como intervalos de 100 nanosegundos (102 * 10-9 = 10-7).

Dejando toda la cháchara de lado el ejemplo que es lo que importa

--queremos representar la fecha 2010-01-07 a las 14:15:00 hrs, es decir, 
--con 513000000000 ticks
SELECT DATEADD(millisecond, 513000000000 / 10000, '2010-01-07')

lo que nos devuelve
2010-01-07 14:15:00.000