2013-08-26 59 views
11

Máy chủ: SQL Server 2012; SP1; Developer EditionThêm giờ và giờ

Code:

declare @datetime datetime = '1900-01-01 00:00:00.000' 

declare @time time = '11:11:11' 

select @datetime + @time 

Khi tôi chạy mã trên trong cơ sở dữ liệu MASTER, tôi nhận được lỗi:

Msg 402, Level 16, State 1, Line 3 The data types datetime and time are incompatible in the add operator.

Nhưng khi đó là bất kỳ cơ sở dữ liệu khác, nó hoạt động! Bất kỳ ý tưởng nào tại sao điều này phải xảy ra?

P.S. - Trong phiên bản doanh nghiệp, điều này sẽ gửi một lỗi không phân biệt bối cảnh cơ sở dữ liệu.

+1

Tôi tìm thấy liên kết hữu ích này http://beyondrelational.com/modules/2/blogs/77/Posts/18855/0239-sql-server-2012-msg-402-the-data-types-datetime -and-time-is-incompatible-in-the-addsubtract-op.aspx –

+0

có thể trùng lặp của [TSQL để thêm trường datetime với một trường thời gian] (http://stackoverflow.com/questions/15228132/tsql-to- thêm-datetime-field-với-một-thời gian-lĩnh vực) –

+0

Cảm ơn Ajay, cho các liên kết thông tin! Tôi chỉ tò mò là tại sao nó vẫn phải chạy trong phiên bản Nhà phát triển năm 2012. Một nửa nướng ra? :-) – tejaslakade

Trả lời

3

Thực ra, không có hành vi hợp lý khi thêm ngày và giờ, trừ khi bạn biết múi giờ cho cả hai giá trị. Cơ sở dữ liệu khác có thể giả định một số múi giờ mặc định tùy ý nhưng SQL Server thì không.

Nếu các nhà thiết kế T-SQL đã thêm hỗ trợ như vậy, phần lớn mã cũ (cả máy chủ và phía máy khách) sẽ bị vỡ với khó phát hiện lỗi. Hãy nhớ rằng, hầu hết mọi người vẫn sử dụng kiểu datetime cũ, giả sử một số múi giờ mặc định (cục bộ hoặc GMT).

Bạn có thể tranh luận rằng việc thêm một DateTimeOffset thời gian nên có thể, vì là người đầu tiên chứa thông tin múi giờ và lần thứ hai không, nhưng tôi nghĩ rằng các nhà thiết kế T-SQL muốn để tránh nhầm lẫn khi chuyển đổi một datatype khác. Rất nhiều mã phía máy khách sẽ vẫn bị ngắt trừ khi mọi người thay đổi mã nhận biết múi giờ theo loại phía máy khách của họ.

Vì vậy, tại sao không có chức năng rõ ràng nào thực hiện việc bổ sung? Có lẽ sẽ không hoạt động, hoặc vì các loại datetime không có múi giờ được chuyển đổi hoàn toàn thành datetimeoffset2. Bạn có thể dễ dàng chuyển một giá trị không có múi giờ đến hàm như vậy và nó sẽ được chuyển đổi thành múi giờ sai TRƯỚC KHI nó được chuyển đến hàm

Trong ngắn hạn, tính tương thích ngược không cung cấp cách xử lý ngày + thời gian an toàn.

5

Đoạn mã trên sẽ hoạt động với MS SqlServer 2008 nhưng mã này sẽ không hoạt động với MS SqlServer 2012 trở lên. Tôi đã gặp phải cùng một vấn đề và giải quyết nó như thế này.

DECLARE @today_start datetime 
DECLARE @dail_time time 

SELECT @today_start = convert(datetime, @dayStr,103) + CAST(@dail_time as DATETIME)