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.