2011-10-19 38 views
29

tôi có một thời gian ngày đó tôi tạo ra như thế này:mili giây trong thay đổi DateTime của tôi khi lưu trữ trong SQL Server

DateTime myDateTime = DateTime.Now; 

sau đó tôi lưu nó trong cơ sở dữ liệu (trong một cột gõ DateTime) với Entity Framework. Sau đó tôi lấy nó với OData (WCF Data Services).

Khi nó đi vào giá trị TimeOfDay là: 09: 30: 03,0196095

Khi nói ra giá trị TimeOfDay là: 09: 30: 03,0200000

Hiệu quả thực của việc này làm cho nó để Mili giây được xem là 19 trước khi nó được lưu và 20 sau khi nó được nạp lại.

Vì vậy, khi tôi so sánh sau trong mã của tôi, nó không thành công khi nó phải bằng nhau.

Máy chủ SQL không có độ chính xác nhiều như .NET không? Hoặc là Entity Framework hoặc OData đang làm rối loạn điều này?

Tôi sẽ chỉ cắt ngắn phần nghìn giây (tôi không thực sự cần đến chúng). Nhưng tôi muốn biết tại sao điều này lại xảy ra.

+0

bạn đang so sánh như thế nào? – ChrisBint

+1

Đó là độ chính xác khác. Xem các câu hỏi liên quan ở bên cạnh. –

+1

Bạn đang sử dụng phiên bản SQL Server nào? Nếu 2008 'datetime2' có độ chính xác cao hơn. –

Trả lời

37

Điều này thực sự phụ thuộc vào phiên bản máy chủ SQL bạn đang sử dụng.

Độ phân giải của trường thời gian ngày là 3 chữ số thập phân: Ví dụ: 2011-06-06 23:59:59.997 và chỉ chính xác đến trong khoảng 3,33 ms.

Trong trường hợp của bạn, 09: 30: 03.0196095 đang được làm tròn lên đến 09: 30: 03.020 về lưu trữ.

Bắt đầu với SQL 2008, các kiểu dữ liệu khác đã được thêm vào để cung cấp thêm chi tiết, chẳng hạn như datetime2 có tối đa 7 chữ số thập phân và chính xác trong vòng 100ns.

Xem sau để biết thêm thông tin: http://www.karaszi.com/SQLServer/info_datetime.asp

Tôi nghĩ rằng đặt cược tốt nhất của bạn là để cung cấp làm tròn đến TRƯỚC thứ hai để lưu trữ nó trong SQL server nếu mili giây là không quan trọng.

3

Độ chính xác của DateTime trong SQL Server là mili giây (.fff). Vì vậy, 0.0196 sẽ làm tròn thành 0.020. Nếu bạn có thể sử dụng datetime2, bạn sẽ có độ chính xác cao hơn.

+0

Than ôi, DateTime2 không được hỗ trợ trong OData. Vì vậy, tôi không thể sử dụng nó. – Vaccano

17

Điều này là do độ chính xác của loại SQL datetime. Theo MSDN:

giá trị Datetime được làm tròn đến số gia của 0,000, 0,003, hoặc 0,007 giây

Nhìn vào làm tròn của datetime Fractional Second chính xác phần của this msdn page và bạn' sẽ hiểu làm thế nào làm tròn được thực hiện.

Như đã nêu bởi những người khác, bạn có thể sử dụng datetime2 thay vì datetime để có một độ chính xác tốt hơn:

  • datetime phạm vi thời gian là 00:00:00 through 23:59:59.997
  • datetime2 phạm vi thời gian là 00:00:00 through 23:59:59.9999999
+0

datetime2 vẫn làm tròn số phần nghìn giây theo cùng một cách cho tôi. tại sao?? – RobPio

2

Đối với những người không có khả năng sử dụng DateTime2 trong SQL (ví dụ: tôi sử dụng các bảng được tạo bởi một hệ thống riêng biệt có thể là expensiv e để thay đổi cho vấn đề này), có một sửa đổi mã đơn giản sẽ làm tròn cho bạn.

Tham chiếu System.Data và nhập không gian tên System.Data.SqlTypes. Sau đó bạn có thể sử dụng cấu trúc SqlDateTime để làm việc chuyển đổi cho bạn:

DateTime someDate = new SqlDateTime(DateTime.Now).Value; 

này sẽ chuyển đổi các giá trị vào SQL ve, và sau đó trở lại vào NET ve, bao gồm cả việc mất độ chính xác. :)

Cảnh báo, điều này sẽ mất Kind của cấu trúc DateTime gốc (ví dụ: Utc, Local). Chuyển đổi này cũng không đơn giản làm tròn, có một chuyển đổi hoàn chỉnh bao gồm tính toán đánh dấu, MaxTime thay đổi, v.v. Vì vậy, không sử dụng điều này nếu bạn đang dựa vào các chỉ số cụ thể trong DateTime vì chúng có thể bị mất.

Các vấn đề liên quan