Tato odpověď jednoduše řeší převod .NET DateTimes do binárního formátu, který je ekvivalentní datetime
SQL Serveru. datový typ, takže se domnívám, že je natolik odlišný, že vyžaduje samostatnou odpověď (zkontroloval jsem zde
a zde pro jistotu, že to bylo v pořádku).
Jak zdůraznil @Martin Smith, binární formát datetime
není pouze počet zatržení od určitého okamžiku.
datetime
je uloženo jako 8 bajtů, přičemž první 4 bajty představují počet dní od 1.1. /P>
Abychom převedli .NET DateTime na ekvivalentní binární reprezentaci, musíme určit počet dní od '01-01-1900', převést jej na hex a poté počet tiků od půlnoci, což je od půlnoci trochu komplikované. .NET tick je 100ns.
Například:
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");
Když jsem spustil tento kód, dt
bylo 9/14/2011 23:19:03.366
a nastavil hex
na 0x00009F5E01804321
, který byl převeden na 2011-09-14 23:19:03.363
na serveru SQL.
Věřím, že vždy budete mít problém získat přesné datum kvůli zaokrouhlování, ale pokud můžete použít dotaz, kde se datum a čas nemusí přesně shodovat, až na milisekundu, mohlo by to být dostatečně blízko.
Upravit
Ve svém komentáři pod první odpovědí, kterou jsem zveřejnil, jsem se ptal na SQL Server 2008, protože datetime2
datový typ ukládá čas s přesností 100 ns (alespoň s výchozí přesností), což dobře odpovídá .NET. Pokud vás zajímá, jak se to ukládá na binární úrovni na SQL Server, přečtěte si moje odpověď
na starší otázku.