Ngoài ra, làm thế nào Microsoft làm cho du hành thời gian có thể?
Xem xét mã này:
DECLARE @Offset datetimeoffset = sysdatetimeoffset();
DECLARE @UTC datetime = getUTCdate();
DECLARE @UTCFromOffset datetime = CONVERT(datetime,SWITCHOFFSET(@Offset,0));
SELECT
Offset = @Offset,
UTC = @UTC,
UTCFromOffset = @UTCFromOffset,
TimeTravelPossible = CASE WHEN @UTC < @UTCFromOffset THEN 1 ELSE 0 END;
@Offset
được đặt trước @UTC
, nhưng đôi khi nó có giá trị sau . (Tôi đã thử điều này trên SQL Server 2008 R2 và SQL Server 2016. Bạn phải chạy nó một vài lần để bắt gặp sự cố nghi ngờ.)
Điều này dường như không chỉ đơn giản là vấn đề làm tròn hoặc thiếu độ chính xác. (Trên thực tế, tôi nghĩ rằng việc làm tròn là điều thỉnh thoảng "khắc phục" sự cố.) Các giá trị cho một lần chạy mẫu như sau:
- Bù lại
- 2017-06-07 12: 01: 58,8801139 -05: 00
- UTC
- 2017-06-07 17: 01: 58.877
- UTC từ Offset:
- 2017-06-07 17: 01: 58.880
Vì vậy, độ chính xác của datetime cho phép .880 là một giá trị hợp lệ.
Ngay cả các ví dụ GETUTCDATE của Microsoft cũng cho thấy các giá trị SYS * muộn hơn các phương thức cũ hơn, mặc dù đã được chọn trước đó :
SELECT 'SYSDATETIME() ', SYSDATETIME(); SELECT 'SYSDATETIMEOFFSET()', SYSDATETIMEOFFSET(); SELECT 'SYSUTCDATETIME() ', SYSUTCDATETIME(); SELECT 'CURRENT_TIMESTAMP ', CURRENT_TIMESTAMP; SELECT 'GETDATE() ', GETDATE(); SELECT 'GETUTCDATE() ', GETUTCDATE(); /* Returned: SYSDATETIME() 2007-05-03 18:34:11.9351421 SYSDATETIMEOFFSET() 2007-05-03 18:34:11.9351421 -07:00 SYSUTCDATETIME() 2007-05-04 01:34:11.9351421 CURRENT_TIMESTAMP 2007-05-03 18:34:11.933 GETDATE() 2007-05-03 18:34:11.933 GETUTCDATE() 2007-05-04 01:34:11.933 */
Tôi đoán điều này là do chúng đến từ các thông tin hệ thống cơ bản khác nhau. Bất cứ ai có thể xác nhận và cung cấp chi tiết?
Tài liệu SYSDATETIMEOFFSET của Microsoft cho biết "SQL Server có được các giá trị ngày và thời gian bằng cách sử dụng API Windows GetSystemTimeAsFileTime ()" (cảm ơn srutzky), nhưng tài liệu GETUTCDATE của họ ít cụ thể hơn, chỉ nói rằng "giá trị được lấy từ hệ điều hành của máy tính mà phiên bản SQL Server đang chạy ".
(Điều này không hoàn toàn mang tính học thuật. Tôi gặp phải một vấn đề nhỏ do nguyên nhân này. Tôi đã nâng cấp một số quy trình để sử dụng SYSDATETIMEOFFSET thay vì GETUTCDATE, với hy vọng có độ chính xác cao hơn trong tương lai, nhưng tôi bắt đầu nhận được đơn đặt hàng kỳ lạ vì các quy trình khác là vẫn đang sử dụng GETUTCDATE và đôi khi "nhảy về phía trước" các quy trình được chuyển đổi của tôi trong nhật ký.)