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.