Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir DateTime en équivalent hexadécimal dans VB.NET

Cette réponse traite simplement de la conversion de .NET DateTimes en un format binaire équivalent au datetime de SQL Server. type de données, donc je pense qu'il est suffisamment différent pour justifier une réponse distincte (j'ai vérifié ici et ici pour être sûr que tout allait bien).

Comme @Martin Smith l'a souligné, le format binaire de datetime n'est pas simplement un nombre de ticks depuis un moment précis.

datetime est stocké sur 8 octets, les 4 premiers octets étant le nombre de jours depuis le 01-01-1900 et les 4 seconds octets étant le nombre de "ticks" depuis minuit de ce jour, où un tick correspond à 10/3 millisecondes.

Afin de convertir un .NET DateTime en une représentation binaire équivalente, nous devons déterminer le nombre de jours depuis '01-01-1900', le convertir en hexadécimal, puis le nombre de ticks depuis minuit, ce qui est un peu compliqué puisque un tick .NET vaut 100ns.

Par exemple :

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");

Quand j'ai exécuté ce code, dt était 9/14/2011 23:19:03.366 , et il définit hex à 0x00009F5E01804321 , qui a été converti en 2011-09-14 23:19:03.363 dans SQL Server.

Je pense que vous aurez toujours un problème pour obtenir la date exacte à cause de l'arrondi, mais si vous pouvez utiliser une requête où la date et l'heure ne doivent pas correspondre exactement, à la milliseconde près, cela pourrait être assez proche.

Modifier

Dans mon commentaire sous la première réponse que j'ai postée, j'ai posé des questions sur SQL Server 2008, car le datetime2 Le type de données stocke le temps avec une précision de 100 ns (du moins, il le fait avec la précision par défaut), ce qui correspond bien à .NET. Si vous êtes intéressé par la façon dont cela est stocké au niveau binaire dans SQL Server, consultez ma réponse à une question plus ancienne.