Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao Datediff giữa GETDATE () và SYSDATETIME () tính bằng mili giây luôn khác nhau?

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()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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tách hàng dựa trên giá trị cột

  2. CHÈN CÁC GIÁ TRỊ KHÔNG TỒN TẠI

  3. Cách thêm cột mới vào bảng hiện có trong SQL Server (T-SQL)

  4. Gợi ý để triển khai bảng kiểm tra trong SQL Server?

  5. Thay đổi đối chiếu SQL Server thành phân biệt chữ hoa chữ thường từ phân biệt chữ hoa chữ thường?