Ta odpowiedź po prostu dotyczy konwersji .NET DateTimes na format binarny, który jest odpowiednikiem datetime
programu SQL Server datatype, więc uważam, że jest na tyle inny, że wymaga osobnej odpowiedzi (sprawdziłem tutaj
i tutaj aby mieć pewność, że wszystko jest w porządku).
Jak zauważył @Martin Smith, binarny format datetime
to nie tylko liczba tików od określonego momentu.
datetime
jest przechowywany jako 8 bajtów, przy czym pierwsze 4 bajty to liczba dni od 01-01-1900, a drugie 4 bajty to liczba „ticków” od północy tego dnia, gdzie tik wynosi 10/3 milisekund.
Aby przekonwertować .NET DateTime na równoważną reprezentację binarną, musimy określić liczbę dni od „01-01-1900”, przekonwertować to na szesnastkowy, a następnie liczbę tików od północy, co jest nieco skomplikowane, ponieważ tick .NET to 100ns.
Na przykład:
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");
Kiedy uruchomiłem ten kod, dt
był 9/14/2011 23:19:03.366
i ustawia hex
do 0x00009F5E01804321
, który został przekonwertowany na 2011-09-14 23:19:03.363
w SQL Server.
Uważam, że zawsze będziesz mieć problem z uzyskaniem dokładnej daty z powodu zaokrąglania, ale jeśli możesz użyć zapytania, w którym data i godzina nie muszą być dokładnie dopasowane, z dokładnością do milisekundy, może to być wystarczająco bliskie.
Edytuj
W moim komentarzu pod pierwszą opublikowaną odpowiedzią zapytałem o SQL Server 2008, ponieważ datetime2
typ danych przechowuje czas z dokładnością do 100 ns (przynajmniej z domyślną precyzją), co dobrze pasuje do .NET. Jeśli interesuje Cię, jak to jest przechowywane na poziomie binarnym w SQL Server, zobacz moja odpowiedź
na starsze pytanie.