2015-06-30 19 views
23

Khi tôi thực hiện truy vấn sau, tôi nhận được các kết quả khác nhau.Tại sao hàm Datediff hiển thị các giá trị khác nhau?

SELECT Datediff(year, 0, Getdate()); 

Kết quả được 115

Khi tôi sử dụng này, tôi nhận được một kết quả khác:

SELECT Datediff(year, 1900, Getdate()); 

Kết quả là 110

Trên thực tế trong SQL Server nó sẽ lấy từ 1900-01-01, nhưng tại sao những giá trị này lại hiển thị các giá trị khác nhau?

+3

nếu bạn thay đổi 1900 đến '1900 bạn sẽ nhận được kết quả tương tự như ví dụ đầu tiên của bạn - '1900' sẽ được truyền nội bộ theo số 1900-01-01 –

Trả lời

23

Hãy thử này để giải thích logic:

select cast(0 as datetime) 
select cast(1 as datetime) 

Một số nguyên được hiểu là số ngày kể từ 1900-01-01 trong khi một giá trị chuỗi như '1900' sẽ được hiểu là một dạng ngày.

1900 Ngày từ ngày 1 tháng 1 năm 1900 là 1905-03-16, là năm năm kể từ năm 1900 và 110 năm kể từ bây giờ (2015).

15

Điều này là do nếu bạn truyền 0 là datetime, nó trả về 1900 là phần năm, trong khi 1900 được coi là datetime trả về 1905 là phần năm.

Demo

Từ MSDN:

giá trị với các kiểu dữ liệu datetime được lưu trữ trong nội bộ của Microsoft SQL Server như hai số nguyên 4 byte. 4 byte đầu tiên lưu trữ số ngày trước hoặc sau ngày cơ sở, ngày 1 tháng 1 năm 1900. Ngày cơ sở là ngày tham chiếu hệ thống.

Điều đó có nghĩa là truyền chữ 0 đến datetime tương đương với nhận giá trị ngày giờ trong 0 ngày sau 1/1/1900, là 1/1/1900. Tương tự như vậy cho năm 1900. Do đó, như @MartinSmith chỉ ra trong các nhận xét, phép tính của bạn tương đương với SELECT Datediff(year,dateadd(d,0,'1/1/1900'), Getdate()) trả về 115 như mong đợi.

Có thể đáng chú ý là trang MSDN trên Truyền và Chuyển đổi không bao gồm cụ thể trường hợp này, tức là int đến datetime.

+4

Thiếu giải thích rằng việc truyền một int vào datetime có hiệu quả giống như 'DATEADD (DAY' thành' 1900-01-01' –

+0

@MartinSmith Agreed. từ MSDN nếu có bất cứ điều gì cụ thể bout giá trị 0. Bạn có thể vui lòng chỉ cho tôi không? –

+0

Không thể thấy điều này được đề cập trong chủ đề 'CAST'. Ngày cơ sở của ngày 1 tháng 1 năm 1900 cho biểu diễn nhị phân được đề cập ở đây https://technet.microsoft.com/en-us/library/aa258277(v=sql.80).aspx –

3

Số bạn chỉ định sẽ được thêm vào làm ngày dẫn đến sự khác biệt.

Select DATEADD(dd,0,0) 
Select DATEADD(dd,1900,0) 

result1 là 1900 result2 là 1905.

Vì vậy, việc sử dụng chúng bằng:

SELECT Datediff(year,0, Getdate()) = SELECT Datediff(year,DATEADD(dd,0,0), Getdate()); 

SELECT Datediff(year,1900, Getdate()) = SELECT Datediff(year,DATEADD(dd,1900,0), Getdate());; 
Các vấn đề liên quan