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.