Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Converti DateTime in equivalente esadecimale in VB.NET

Questa risposta risolve semplicemente la conversione di .NET DateTimes in un formato binario equivalente a datetime di SQL ServerSQL Server tipo di dati, quindi credo che sia abbastanza diverso da giustificare una risposta separata (ho controllato qui e qui per essere sicuro che fosse ok).

Come ha sottolineato @Martin Smith, il formato binario di datetime non è semplicemente un numero di tick da un momento specifico.

datetime è memorizzato come 8 byte, i primi 4 byte sono il numero di giorni trascorsi dal 01-01-1900 e i secondi 4 sono il numero di "tick" dalla mezzanotte di quel giorno, dove un tick è 10/3 millisecondi.

Per convertire un DateTime .NET in una rappresentazione binaria equivalente, dobbiamo determinare il numero di giorni da '01-01-1900', convertirlo in esadecimale e quindi il numero di tick da mezzanotte, il che è leggermente complicato poiché un segno di spunta .NET è 100ns.

Ad esempio:

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");

Quando ho eseguito questo codice, dt era 9/14/2011 23:19:03.366 , e imposta hex a 0x00009F5E01804321 , convertito in 2011-09-14 23:19:03.363 in SQL Server.

Credo che avrai sempre problemi a ottenere la data esatta a causa dell'arrotondamento, ma se puoi utilizzare una query in cui datetime non devono corrispondere esattamente, fino al millisecondo, potrebbe essere abbastanza vicino.

Modifica

Nel mio commento sotto la prima risposta che ho pubblicato, ho chiesto informazioni su SQL Server 2008, perché datetime2 il tipo di dati memorizza il tempo con una precisione di 100 ns (almeno, lo fa con la precisione predefinita), che corrisponde perfettamente a .NET. Se sei interessato a come viene archiviato a livello binario in SQL Server, consulta la mia risposta a una domanda precedente.