Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie DateTime in Hex-Äquivalent in VB.NET

Diese Antwort befasst sich einfach mit der Konvertierung von .NET DateTimes in ein Binärformat, das datetime von SQL Server entspricht Datentyp, also glaube ich, dass es so unterschiedlich ist, dass es eine separate Antwort rechtfertigt (ich habe hier und hier um sicherzugehen, dass es in Ordnung war).

Wie @Martin Smith betonte, ist das Binärformat von datetime ist nicht einfach eine Anzahl von Ticks seit einem bestimmten Zeitpunkt.

datetime wird als 8 Bytes gespeichert, wobei die ersten 4 Bytes die Anzahl der Tage seit dem 01.01.1900 und die zweiten 4 Bytes die Anzahl der "Ticks" seit Mitternacht dieses Tages sind, wobei ein Tick 10/3 Millisekunden entspricht.

Um eine .NET-DateTime in eine äquivalente binäre Darstellung umzuwandeln, müssen wir die Anzahl der Tage seit dem 01.01.1900 bestimmen, diese in Hex umwandeln und dann die Anzahl der Ticks seit Mitternacht, was seitdem etwas kompliziert ist ein .NET-Tick beträgt 100 ns.

Zum Beispiel:

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

Als ich diesen Code ausführte, dt war 9/14/2011 23:19:03.366 , und es setzt hex zu 0x00009F5E01804321 , die in 2011-09-14 23:19:03.363 umgewandelt wurde im SQL-Server.

Ich glaube, Sie werden aufgrund der Rundung immer ein Problem haben, das genaue Datum zu erhalten, aber wenn Sie eine Abfrage verwenden können, bei der die Datumszeit nicht genau bis auf die Millisekunde übereinstimmen muss, könnte dies nahe genug sein.

Bearbeiten

In meinem Kommentar unter der ersten Antwort, die ich gepostet habe, habe ich nach SQL Server 2008 gefragt, weil die datetime2 Der Datentyp speichert die Zeit mit einer Genauigkeit von 100 ns (zumindest mit der Standardpräzision), was gut zu .NET passt. Wenn Sie daran interessiert sind, wie dies auf der Binärebene in SQL Server gespeichert wird, lesen Sie meine Antwort zu einer älteren Frage.