Chúng là hai lời gọi hàm khác nhau có thể trả về hai thời điểm khác nhau.
Ngoài ra GETDATE
trả về datetime
kiểu dữ liệu chỉ có độ chính xác 3-4 ms trong khi SYSDATETIME()
trả về datetime2(7)
loại dữ liệu.
Ngay cả khi cả hai cuộc gọi trả về chính xác cùng một thời điểm, bạn có thể thấy sự cố mà bạn đang gặp phải do làm tròn.
DECLARE @D1 DATETIME2 = '2012-08-18 10:08:40.0650000'
DECLARE @D2 DATETIME = @D1 /*Rounded to 2012-08-18 10:08:40.067*/
SELECT DATEDIFF(ms, @D1 , @D2) /*Returns 2*/
Câu trả lời khác không chính xác nếu bạn thay thế bằng GETDATE()
hàm chỉ được gọi một lần như có thể được minh họa từ bên dưới.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0
PRINT 'This will not run in an infinite loop'
Khi chạy vòng lặp trên màn hình Windows XP của tôi với GETDATE()
và SYSDATETIME
Tôi cũng có thể thấy các kết quả cho biết rằng một cái gì đó khác cũng có thể đang xảy ra. Có lẽ đang gọi một API khác.
CREATE TABLE #DT2
(
[D1] [DATETIME2](7),
[D2] [DATETIME2](7)
)
GO
INSERT INTO #DT2
VALUES(Getdate(), Sysdatetime())
GO 100
SELECT DISTINCT [D1],
[D2],
Datediff(MS, [D1], [D2]) AS MS
FROM #DT2
DROP TABLE #DT2
Kết quả ví dụ bên dưới
+-----------------------------+-----------------------------+-----+
| D1 | D2 | MS |
+-----------------------------+-----------------------------+-----+
| 2012-08-18 10:16:03.2500000 | 2012-08-18 10:16:03.2501680 | 0 |
| 2012-08-18 10:16:03.2530000 | 2012-08-18 10:16:03.2501680 | -3 |
| 2012-08-18 10:16:03.2570000 | 2012-08-18 10:16:03.2501680 | -7 |
| 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2657914 | 2 |
| 2012-08-18 10:16:03.2670000 | 2012-08-18 10:16:03.2657914 | -2 |
| 2012-08-18 10:16:03.2700000 | 2012-08-18 10:16:03.2657914 | -5 |
| 2012-08-18 10:16:03.2730000 | 2012-08-18 10:16:03.2657914 | -8 |
| 2012-08-18 10:16:03.2770000 | 2012-08-18 10:16:03.2657914 | -12 |
| 2012-08-18 10:16:03.2800000 | 2012-08-18 10:16:03.2814148 | 1 |
+-----------------------------+-----------------------------+-----+
Các hàng quan tâm là
| 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
Sự khác biệt này quá lớn để trở thành vấn đề làm tròn và không thể chỉ là vấn đề về thời gian với độ trễ giữa việc gọi hai hàm vì sự cố tồn tại trên nhiều hàng GETDATE
báo cáo 10:16:03.26X
trong khi SYSDATETIME
báo cáo 10:16:03.250