Jawaban ini hanya membahas konversi .NET DateTimes ke format biner yang setara dengan datetime
SQL Server tipe data, jadi saya yakin itu cukup berbeda sehingga memerlukan jawaban terpisah (saya memeriksa di sini
dan di sini untuk memastikan itu baik-baik saja).
Seperti yang ditunjukkan @Martin Smith, format biner datetime
bukan sekadar jumlah centang sejak titik waktu tertentu.
datetime
disimpan sebagai 8 byte, 4 byte pertama adalah jumlah hari sejak 01-01-1900 dan 4 byte kedua adalah jumlah "tikus" sejak tengah malam hari itu, di mana kutu adalah 10/3 milidetik.
Untuk mengonversi .NET DateTime ke representasi biner yang setara, kita perlu menentukan jumlah hari sejak '01-01-1900', mengonversinya ke hex, dan kemudian jumlah tick sejak tengah malam, yang sedikit rumit karena centang .NET adalah 100ns.
Misalnya:
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");
Ketika saya menjalankan kode ini, dt
adalah 9/14/2011 23:19:03.366
, dan itu mengatur hex
ke 0x00009F5E01804321
, yang dikonversi ke 2011-09-14 23:19:03.363
di SQL Server.
Saya yakin Anda akan selalu mengalami masalah dalam mendapatkan tanggal yang tepat karena pembulatan, tetapi jika Anda dapat menggunakan kueri di mana datetime tidak harus sama persis, hingga milidetik, ini mungkin cukup dekat.
Sunting
Dalam komentar saya di bawah jawaban pertama yang saya posting, saya bertanya tentang SQL Server 2008, karena datetime2
tipe data tidak menyimpan waktu dengan akurasi 100ns (setidaknya, itu tidak dengan presisi default), yang cocok dengan baik dengan .NET. Jika Anda tertarik dengan bagaimana itu disimpan pada tingkat biner di SQL Server, lihat jawaban saya
ke pertanyaan yang lebih lama.