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.