sql >> Base de Datos >  >> RDS >> Sqlserver

Convierta DateTime a Hex equivalente en VB.NET

Esta respuesta simplemente aborda la conversión de .NET DateTimes a un formato binario que es equivalente a datetime de SQL Server tipo de datos, por lo que creo que es lo suficientemente diferente como para justificar una respuesta separada (verifiqué aquí y aquí para asegurarse de que estaba bien).

Como señaló @Martin Smith, el formato binario de datetime no es simplemente una cantidad de tics desde un punto específico en el tiempo.

datetime se almacena como 8 bytes, los primeros 4 bytes son la cantidad de días desde el 01-01-1900 y los segundos 4 bytes son la cantidad de "ticks" desde la medianoche de ese día, donde una marca es 10/3 milisegundos.

Para convertir un .NET DateTime a una representación binaria equivalente, necesitamos determinar la cantidad de días desde '01-01-1900', convertir eso a hexadecimal y luego la cantidad de tics desde la medianoche, lo cual es un poco complicado ya que un tic de .NET es 100ns.

Por ejemplo:

DateTime dt = DateTime.Now;
DateTime zero = new DateTime(1900, 1, 1);

TimeSpan ts = dt - zero;
TimeSpan ms = ts.Subtract(new TimeSpan(ts.Days, 0, 0, 0));

string hex = "0x" + ts.Days.ToString("X8") + ((int)(ms.TotalMilliseconds/3.33333333)).ToString("X8");

Cuando ejecuté este código, dt fue 9/14/2011 23:19:03.366 , y estableció hex a 0x00009F5E01804321 , que se convirtió a 2011-09-14 23:19:03.363 en SQL Server.

Creo que siempre tendrá problemas para obtener la fecha exacta debido al redondeo, pero si puede usar una consulta en la que la fecha y hora no tiene que coincidir exactamente, hasta el milisegundo, esto podría estar lo suficientemente cerca.

Editar

En mi comentario bajo la primera respuesta que publiqué, pregunté sobre SQL Server 2008, porque datetime2 El tipo de datos almacena el tiempo con una precisión de 100 ns (al menos, lo hace con la precisión predeterminada), lo que coincide muy bien con .NET. Si está interesado en cómo se almacena a nivel binario en SQL Server, consulte mi respuesta a una pregunta anterior.