sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera DateTime till Hexekvivalent i VB.NET

Det här svaret behandlar helt enkelt konvertering av .NET DateTimes till ett binärt format som motsvarar SQL Servers datetime datatyp, så jag tror att den är tillräckligt annorlunda för att den kräver ett separat svar (jag kollade här och här för att vara säker på att det var ok).

Som @Martin Smith påpekade, det binära formatet datetime är inte bara ett antal fästingar sedan en specifik tidpunkt.

datetime lagras som 8 byte, de första 4 byten är antalet dagar sedan 01-01-1900 och de andra 4 byten är antalet "ticks" sedan midnatt den dagen, där en bock är 10/3 millisekunder.

För att konvertera en .NET DateTime till en likvärdig binär representation måste vi bestämma antalet dagar sedan '01-01-1900', konvertera det till hex och sedan antalet markeringar sedan midnatt, vilket är något komplicerat eftersom en .NET-markering är 100ns.

Till exempel:

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

När jag körde den här koden, dt var 9/14/2011 23:19:03.366 , och den satte hex till 0x00009F5E01804321 , som konverterades till 2011-09-14 23:19:03.363 i SQL Server.

Jag tror att du alltid kommer att ha problem med att få det exakta datumet på grund av avrundning, men om du kan använda en fråga där datetime inte behöver matcha exakt, ner till millisekund, kan detta vara tillräckligt nära.

Redigera

I min kommentar under det första svaret jag postade frågade jag om SQL Server 2008, eftersom datetime2 datatypen lagrar tid med en noggrannhet på 100ns (åtminstone gör den det med standardprecisionen), vilket matchar fint med .NET. Om du är intresserad av hur det lagras på binär nivå i SQL Server, se mitt svar till en äldre fråga.



  1. SQL vs MySQL:Regler om aggregerade operationer och GROUP BY

  2. Oracle After Delete Trigger... Hur undviker man mutationstabell (ORA-04091)?

  3. Det gick inte att ansluta till mysql på 127.0.0.1:3306 med användarrotåtkomst nekad för användaren 'root'@'localhost'(med lösenord:JA)

  4. beräkna timmar baserat på öppettider i Oracle SQL