sql >> Databáze >  >> RDS >> Sqlserver

Převést DateTime na Hexadecimální ekvivalent ve VB.NET

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.



  1. Návrh databáze pro systém školní docházky

  2. Chyba Sloupec dotazu SQL neexistuje

  3. PDO::FETCH_ASSOC nenačítá vše

  4. Porovnejte 2 sloupce SQL if =a poté aktualizujte jiný sloupec o 1