Câu trả lời này chỉ giải quyết việc chuyển đổi .NET DateTimes sang định dạng nhị phân tương đương với datetime
của SQL Server datatype, vì vậy tôi tin rằng nó đủ khác biệt để nó đảm bảo một câu trả lời riêng (Tôi đã kiểm tra tại đây
và tại đây để chắc chắn rằng nó ổn).
Như @Martin Smith đã chỉ ra, định dạng nhị phân của datetime
không chỉ đơn giản là một số tích tắc kể từ một thời điểm cụ thể.
datetime
được lưu trữ dưới dạng 8 byte, 4 byte đầu tiên là số ngày kể từ 01-01-1900 và 4 byte thứ hai là số "tích tắc" kể từ nửa đêm của ngày hôm đó, trong đó dấu tích là 10/3 mili giây.
Để chuyển đổi .NET DateTime thành biểu diễn nhị phân tương đương, chúng ta cần xác định số ngày kể từ '01 -01-1900 ', chuyển đổi thành hex, sau đó là số lần đánh dấu kể từ nửa đêm, điều này hơi phức tạp vì một lần đánh dấu .NET là 100ns.
Ví dụ:
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");
Khi tôi chạy mã này, dt
là 9/14/2011 23:19:03.366
và nó đặt hex
tới 0x00009F5E01804321
, được chuyển đổi thành 2011-09-14 23:19:03.363
trong SQL Server.
Tôi tin rằng bạn sẽ luôn gặp vấn đề trong việc lấy ngày chính xác do làm tròn, nhưng nếu bạn có thể sử dụng truy vấn trong đó ngày giờ không phải khớp chính xác, xuống đến mili giây, thì điều này có thể đủ gần.
Chỉnh sửa
Trong nhận xét của tôi dưới câu trả lời đầu tiên tôi đã đăng, tôi đã hỏi về SQL Server 2008, vì datetime2
kiểu dữ liệu lưu trữ thời gian với độ chính xác 100ns (ít nhất là với độ chính xác mặc định), phù hợp nhất với .NET. Nếu bạn quan tâm đến cách nó được lưu trữ ở cấp nhị phân trong SQL Server, hãy xem câu trả lời của tôi
cho một câu hỏi cũ hơn.