GETUTCDATE () - 2 so với DATEADD (d, -2, GETUTCDATE ())


13

Tôi đã tự hỏi sự khác biệt giữa hai phương pháp sau đây là:

 GETUTCDATE()-2  

  DATEADD(d,-2,GETUTCDATE())

Tôi đoán sử dụng DATEADDlà cách chính xác, nhưng đã tự hỏi tại sao?

Câu trả lời:


14

Không có sự khác biệt thực sự ở đó, nhưng khi bạn bắt đầu sử dụng DATETIME2các giá trị hoặc các hàm trả về DATETIME2giá trị, bạn sẽ gặp lỗi.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Msg 206, Cấp 16, Trạng thái 2, Dòng 17 Kiểu va chạm: datetime2 không tương thích với int

Đối với những điều này, bạn phải sử dụng các hàm toán học ngày.

SELECT DATEADD(DAY, -1, SYSDATETIME()) AS [Compatible]

Aaron Bertrand nói ngắn gọn về vấn đề này trong loạt bài Bad Habits to Kick .


8

Trái với tuyên bố trong một trong những câu trả lời khác, cả hai tùy chọn đều được SQL Server hỗ trợ và ghi lại chính thức : datetime - numberđó không phải là hành vi không xác định.

Lợi thế lớn của

DATEADD(d, -2, GETUTCDATE())

là thực tế nó là tài liệu tự : Mục đích của nó là rõ ràng ngay lập tức.

GETUTCDATE() - 2mặt khác, phụ thuộc vào người đọc biết định nghĩa của datetime - numberhoạt động. Đúng, hiện tại nó có thể là T-SQL thành ngữ, nhưng thực tế là điều này không còn được hỗ trợ cho datetime2ngụ ý rằng các thế hệ nhà phát triển SQL Server trong tương lai có thể không còn quen thuộc với nó nữa.


Nó được trình bày rõ ràng hơn ở đây: Toán tử số học (Transact-SQL) " Toán tử cộng (+) và trừ (-) cũng có thể được sử dụng để thực hiện các phép toán số học trên các giá trị datetimesmalldatetime . "
ypercubeᵀᴹ 18/10/17

@ ypercubeᵀᴹ: Dòng đầu tiên của - (Phép trừ) (Transact-SQL) thậm chí còn rõ ràng hơn đơn vị (ngày): "Trừ hai số (toán tử trừ số học). Cũng có thể trừ một số, tính theo ngày, kể từ ngày . "
Heinzi

có tôi đã thấy. Và sau đó "Không thể được sử dụng với các kiểu dữ liệu ngày, giờ, datetime2 hoặc datetimeoffset." Vì vậy, "ngày" trong câu đầu tiên có nghĩa là bất kỳ loại ngày / giờ nào ngoại trừ các loại ngày bị cấm (vì vậy chỉ có datetime và smalldatetime, về cơ bản là các loại datetime tồn tại trước phiên bản 2008 (?) dateĐã được thêm vào). Nó hơi lộn xộn.
ypercubeᵀᴹ

Có lẽ đó là một điều khác mà bạn có thể thêm vào câu trả lời của bạn. Việc nhà điều hành này không hỗ trợ các loại mới cho thấy nó chỉ được giữ vì lý do tương thích ngược.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.