sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter DateTime til Hex-ækvivalent i VB.NET

Dette svar omhandler blot konvertering af .NET DateTimes til et binært format, der svarer til SQL Servers datetime datatype, så jeg mener, at den er anderledes nok til, at den berettiger til et separat svar (jeg tjekkede her og her for at være sikker på, at det var ok).

Som @Martin Smith påpegede, er det binære format datetime er ikke blot et antal flueben siden et bestemt tidspunkt.

datetime er gemt som 8 bytes, hvor de første 4 bytes er antallet af dage siden 01-01-1900 og de anden 4 bytes er antallet af "ticks" siden midnat den pågældende dag, hvor et flueben er 10/3 millisekunder.

For at konvertere en .NET DateTime til en tilsvarende binær repræsentation, skal vi bestemme antallet af dage siden '01-01-1900', konvertere det til hex og derefter antallet af kryds siden midnat, hvilket er lidt kompliceret siden et .NET-flueben er 100ns.

For eksempel:

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

Da jeg kørte denne kode, dt var 9/14/2011 23:19:03.366 , og den satte hex til 0x00009F5E01804321 , som konverterede til 2011-09-14 23:19:03.363 i SQL Server.

Jeg tror, ​​at du altid vil have et problem med at få den nøjagtige dato på grund af afrunding, men hvis du kan bruge en forespørgsel, hvor datetime ikke behøver at matche nøjagtigt, ned til millisekundet, kan dette være tæt nok.

Rediger

I min kommentar under det første svar, jeg postede, spurgte jeg om SQL Server 2008, fordi datetime2 datatypen gemmer tid med en nøjagtighed på 100ns (det gør den i det mindste med standardpræcisionen), hvilket passer fint med .NET. Hvis du er interesseret i, hvordan det er gemt på binært niveau i SQL Server, se mit svar til et ældre spørgsmål.



  1. Inner Join laravel 5.2

  2. Hvorfor får jeg System.Data.DataRowView i stedet for rigtige værdier i min Listbox?

  3. Henter rækkeantal og returnerer 0, når der ikke er nogen rækker

  4. Hvordan finder man summen af ​​flere kolonner i en tabel i SQL Server 2005?