2009-04-03 27 views
55

Tôi có một bảng có cấu trúc như thế này:Tại sao SQL Server mất một phần nghìn giây?

CREATE TABLE [TESTTABLE] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [DateField] [datetime] NULL, 
    [StringField] [varchar](50), 
    [IntField] [int] NULL, 
    [BitField] [bit] NULL 
) 

tôi thực hiện các đoạn mã sau:

BEGIN 
    INSERT INTO TESTTABLE (IntField, BitField, StringField, DateField) 
    VALUES ('1', 1, 'hello', {ts '2009-04-03 15:41:27.378'}); 

    SELECT SCOPE_IDENTITY() 
END 

Và sau đó

select * from testtable with (NOLOCK) 

và kết quả của tôi cho thấy:

2009-04-03 15:41:27.*377* 

cho cột DateField.

Bất kỳ ý tưởng nào khiến tôi dường như mất một phần nghìn giây ??

+0

tôi ghi nhận cùng một sai lầm với các ngày như '2008-12-31 23: 59: 59,999' –

+1

nhìn lúc này: CONVERT SELECT (DATETIME, '2008-12-31 23: 59: 59,999 ') –

+0

[Xem câu hỏi này] (http://stackoverflow.com/questions/634122) để biết thêm chi tiết –

Trả lời

77

Máy chủ SQL chỉ lưu trữ thời gian tới khoảng 1/300 giây. Chúng luôn rơi vào 0, 3 và 7 mili giây. Ví dụ. đếm từ 0 trong thặng dư nhỏ nhất:

00: 00: 00.000
00: 00: 00.003
00: 00: 00.007
00: 00: 00.010
00: 00: 00.013
..

Nếu bạn cần độ chính xác đến mili giây, không có cách nào thú vị xung quanh nó. Các tùy chọn tốt nhất mà tôi đã thấy là lưu trữ giá trị trong các trường số tùy chỉnh và xây dựng lại giá trị đó mỗi khi bạn tìm nạp giá trị hoặc lưu trữ nó dưới dạng chuỗi có định dạng đã biết. Sau đó bạn có thể (tùy chọn) lưu trữ ngày 'gần đúng' theo kiểu ngày gốc để tăng tốc độ, nhưng nó giới thiệu một sự phức tạp về khái niệm mà thường không được mong muốn.

+11

Hãy nhớ đọc bài đăng của Rob Garrison về TIME và DATETIME2 - những loại này có độ phân giải cao hơn nhiều. –

5

Máy chủ SQL chỉ chính xác đến 1/300 giây. Nó sẽ làm tròn các giá trị tới mức 1/300 gần nhất.

+0

Cảm ơn bạn đã trả lời. Làm tôi cảm thấy tốt hơn. Tôi chỉ cần điều chỉnh các bài kiểm tra đơn vị của mình. :) – sproketboy

+1

Đóng, độ phân giải 3/1000 sẽ là 000, 003, 006, 009 ... Độ phân giải 1/300 là 000, 003, 007, 010 ... – Eclipse

2

Tôi đã nghe, nhưng không thể tìm thấy một tài liệu tham khảo chính thức, mà các cửa hàng SQL Server giá trị datetime với một độ chính xác của 3 mili giây.

3

DATETIME không có độ chính xác vô hạn - có thể bạn đang sử dụng giá trị không thể đại diện chính xác với các bit có sẵn.

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