Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Converter DateTime para Hex equivalente em VB.NET


Esta resposta simplesmente aborda a conversão de .NET DateTimes para um formato binário equivalente ao datetime do SQL Server datatype, então acredito que seja diferente o suficiente para justificar uma resposta separada (verifiquei aqui e aqui para ter certeza de que estava tudo bem).

Como @Martin Smith apontou, o formato binário de datetime não é simplesmente um número de ticks desde um ponto específico no tempo.

datetime é armazenado como 8 bytes, os primeiros 4 bytes sendo o número de dias desde 01-01-1900 e os segundos 4 bytes sendo o número de "ticks" desde a meia-noite daquele dia, onde um tick é 10/3 milissegundos.

Para converter um .NET DateTime em uma representação binária equivalente, precisamos determinar o número de dias desde '01-01-1900', convertê-lo em hexadecimal e, em seguida, o número de tiques desde a meia-noite, o que é um pouco complicado, pois um tique .NET é 100ns.

Por exemplo:
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 executei este código, dt foi 9/14/2011 23:19:03.366 , e define hex para 0x00009F5E01804321 , que foi convertido para 2011-09-14 23:19:03.363 no SQL Server.

Eu acredito que você sempre terá um problema para obter a data exata por causa do arredondamento, mas se você puder usar uma consulta em que a data e hora não precisa corresponder exatamente, até o milissegundo, isso pode ser próximo o suficiente.

Editar

No meu comentário na primeira resposta que postei, perguntei sobre o SQL Server 2008, porque o datetime2 tipo de dados armazena o tempo com uma precisão de 100ns (pelo menos, com a precisão padrão), o que combina muito bem com .NET. Se você estiver interessado em como isso é armazenado no nível binário no SQL Server, consulte minha resposta para uma pergunta mais antiga.