2009-03-11 57 views
11

Tôi đã gặp sự cố liên quan đến chuyển đổi thời gian biểu từ XML (ISO8601: yyyy-mm-ddThh: mi: ss.mmm) sang SQL Server 2005 datetime. Vấn đề là khi chuyển đổi mili giây là sai. Tôi đã thử nghiệm cả hai chuyển đổi ngầm và rõ ràng sử dụng chuyển đổi (datetime, chứa ngày, 126) từ nvarchar, và kết quả là như nhau:Sai số giây khi chuyển đổi từ XML sang SQL Server datetime

Original    Result 
2009-10-29T15:43:12.990 2009-10-29 15:43:12.990 
2009-10-29T15:43:12.991 2009-10-29 15:43:12.990 
2009-10-29T15:43:12.992 2009-10-29 15:43:12.993 
2009-10-29T15:43:12.993 2009-10-29 15:43:12.993 
2009-10-29T15:43:12.994 2009-10-29 15:43:12.993 
2009-10-29T15:43:12.995 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.996 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.997 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.998 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.999 2009-10-29 15:43:13.000 

kiểm tra không sâu rộng của tôi cho thấy rằng các chữ số cuối cùng là hoặc là 0, 3 hoặc 7. Đây có phải là một vấn đề làm tròn đơn giản không? Mili giây chính xác là quan trọng, và mất/đạt được một hoặc hai không phải là một lựa chọn.

Trả lời

17

Vâng, SQL Server vòng thời gian để 3.(3) mili giây:

SELECT CAST(CAST('2009-01-01 00:00:00.000' AS DATETIME) AS BINARY(8)) 
SELECT CAST(CAST('2009-01-01 00:00:01.000' AS DATETIME) AS BINARY(8)) 

0x00009B8400000000 
0x00009B840000012C 

Như bạn có thể thấy, những DATETIME 's khác nhau bởi 1 thứ hai, và cơ quan đại diện nhị phân của họ khác nhau bởi 0x12C, đó là 300 trong hệ thập phân.

Điều này là do SQL Server lưu trữ số time một phần của DATETIME dưới dạng số lượng 1/300 bọ ve thứ hai từ nửa đêm.

Nếu bạn muốn chính xác hơn, bạn cần lưu trữ một phần TIME dưới dạng giá trị riêng biệt. Giống như, thời gian lưu trữ được làm tròn thành giây như là DATETIME và mili giây hoặc bất kỳ độ chính xác nào bạn cần làm INTEGER trong một cột khác.

này sẽ cho phép bạn sử dụng phức tạp DATETIME arithmetics, giống như thêm tháng hoặc tìm các ngày trong tuần trên DATETIME 's, và bạn chỉ có thể thêm hoặc trừ đi các mili giây và nối kết quả như .XXXXXX+HH:MM để có được XML đại diện hợp lệ.

+0

Giải pháp là gì? –

+0

Tôi muốn nói, không sử dụng datatyp DateTime của SQL Server. Lưu trữ giá trị trong VARCHAR thay thế. –

+1

Cảm ơn, điều này đã được khai sáng, mặc dù hơi thất vọng. – chriscena

6

Do precision issues mentioned by Quassnoi nếu bạn có tùy chọn để sử dụng sử dụng SQLServer 2008 bạn có thể xem xét sử dụng datetime2 datatype hoặc nếu bạn chỉ quan tâm đến việc bán thời gian, bạn có thể sử dụng time datatype

Date and Time Data Types - liệt kê tất cả các loại và độ chính xác của họ

Trong Sql Server 2005 nếu tôi cần độ chính xác 1 mili giây, tôi sẽ thêm cột thêm mili giây loại int để lưu số milisecond và loại bỏ phần mili giây khỏi cột ngày giờ (đặt thành 000). Giả sử rằng bạn cũng cần thông tin ngày tháng.

+0

Chúng tôi đã làm thử nghiệm với SQL Server 2008, nhưng khách hàng vẫn còn vào năm 2005. Nâng cấp đã được đề xuất. – chriscena

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