Този отговор просто адресира преобразуването на .NET DateTimes в двоичен формат, който е еквивалентен на datetime
на SQL Server тип данни, така че вярвам, че е достатъчно различен, за да изисква отделен отговор (отметнах тук
и тук за да сте сигурни, че е наред).
Както посочи @Martin Smith, двоичният формат на datetime
не е просто брой отметки от определен момент във времето.
datetime
се съхранява като 8 байта, като първите 4 байта са броят на дните от 01.01.1900 г., а вторите 4 байта са броят на "отметките" от полунощ на този ден, където отметката е 10/3 милисекунди.
За да преобразуваме .NET DateTime в еквивалентно двоично представяне, трябва да определим броя на дните от '01-01-1900', да го преобразуваме в шестнадесетичен и след това броя на тиковете от полунощ, което е малко сложно, тъй като .NET тик е 100ns.
Например:
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");
Когато изпълних този код, dt
беше 9/14/2011 23:19:03.366
и задава hex
до 0x00009F5E01804321
, което се преобразува в 2011-09-14 23:19:03.363
в SQL Server.
Вярвам, че винаги ще имате проблем с получаването на точната дата поради закръгляване, но ако можете да използвате заявка, при която датата и часът не трябва да съвпада точно, до милисекунда, това може да е достатъчно близо.
Редактиране
В моя коментар под първия отговор, който публикувах, попитах за SQL Server 2008, защото datetime2
типът данни съхранява време с точност от 100ns (поне го прави с точността по подразбиране), което съвпада добре с .NET. Ако се интересувате как това се съхранява на двоично ниво в SQL Server, вижте моят отговор
към по-стар въпрос.