sql >> Database >  >> RDS >> Sqlserver

Converteer DateTime naar Hex-equivalent in VB.NET

Dit antwoord behandelt eenvoudig de conversie van .NET DateTimes naar een binair formaat dat gelijk is aan datetime van SQL Server datatype, dus ik geloof dat het anders genoeg is dat het een apart antwoord rechtvaardigt (ik heb hier en hier om er zeker van te zijn dat het in orde was).

Zoals @Martin Smith opmerkte, is het binaire formaat van datetime is niet zomaar een aantal tikken sinds een bepaald tijdstip.

datetime wordt opgeslagen als 8 bytes, waarbij de eerste 4 bytes het aantal dagen zijn sinds 01-01-1900 en de tweede 4 bytes het aantal "ticks" sinds middernacht van die dag, waarbij een tick 10/3 milliseconden is.

Om een ​​.NET DateTime naar een gelijkwaardige binaire representatie te converteren, moeten we het aantal dagen sinds '01-01-1900' bepalen, dat converteren naar hex en vervolgens het aantal tikken sinds middernacht, wat enigszins gecompliceerd is sinds een .NET-vinkje is 100ns.

Bijvoorbeeld:

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

Toen ik deze code uitvoerde, dt was 9/14/2011 23:19:03.366 , en het zette hex naar 0x00009F5E01804321 , die is geconverteerd naar 2011-09-14 23:19:03.363 in SQL Server.

Ik denk dat je altijd een probleem zult hebben om de exacte datum te krijgen vanwege afronding, maar als je een zoekopdracht kunt gebruiken waarbij de datum/tijd niet exact hoeft overeen te komen, tot op de milliseconde, kan dit dicht genoeg zijn.

Bewerken

In mijn commentaar onder het eerste antwoord dat ik plaatste, vroeg ik naar SQL Server 2008, omdat de datetime2 datatype slaat wel tijd op met een nauwkeurigheid van 100ns (tenminste, met de standaardprecisie), wat mooi overeenkomt met .NET. Als je geïnteresseerd bent in hoe dat op binair niveau wordt opgeslagen in SQL Server, zie mijn antwoord op een oudere vraag.



  1. Snellere manier om voor en na de geselecteerde rij te selecteren

  2. Hoe een bidirectionele unieke index over meerdere kolommen te implementeren

  3. Hoe BEL je een PROCEDURE in MySQL?

  4. Oracle equivalent aan SQL Server/Sybase DateDiff