Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj DateTime na odpowiednik szesnastkowy w VB.NET

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawianie identyfikatorów GUID za pomocą SqlBulkCopy

  2. Dlaczego porównywanie zmiennej daty SQL z wartością null zachowuje się w ten sposób?

  3. Utwórz tabelę HTML za pomocą SQL FOR XML

  4. Grupuj podobne obiekty w różnych zakresach dat, aby uzyskać daty minimalne i maksymalne w SQL Server

  5. Serwer SQL 2016