Đó chỉ là hành vi được ghi nhận. Tôi không nghĩ có ai nhầm lẫn với các thiết lập.
Xem ưu tiên loại dữ liệu trên MSDN.
Khi một toán tử kết hợp hai biểu thức của các loại dữ liệu khác nhau, các quy tắc về quyền ưu tiên loại dữ liệu xác định rằng loại dữ liệu có mức ưu tiên thấp hơn được chuyển đổi thành loại dữ liệu có mức độ ưu tiên cao hơn.
Như đã lưu ý trong các nhận xét, chuỗi trống được chuyển đổi thành 0 ở bất kỳ loại số nào và thành 1900-01-01 00: 00: 00.000 khi được chuyển đổi thành một ngày.
EDIT: Tôi nghĩ vấn đề thực sự của bạn là thiết kế của bạn để bạn phải tham gia vào các trường thuộc loại dữ liệu khác nhau. Cách duy nhất để giải quyết vấn đề này là chuyển đổi thành mệnh đề tham gia của bạn, điều này sẽ ảnh hưởng đến hiệu năng truy vấn. Vấn đề chính có lẽ là với thiết kế lược đồ
EDIT: Có rất nhiều cuộc thảo luận trong các bình luận đã được chuyển sang trò chuyện. Tuy nhiên có vẻ phi logic, việc chuyển đổi một chuỗi rỗng sang các loại dữ liệu khác tạo ra các giá trị tùy ý.
Mã này:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Sản xuất đầu ra này:
0
0
1900-01-01
1900-01-01 00:00:00.000
Sau đó, bạn có thể mong đợi rằng hành vi này phù hợp giữa các kiểu dữ liệu trước đó và hy vọng rằng việc chuyển đổi 0 thành một ngày sẽ tạo ra cùng một giá trị tùy ý nhưng không.
SELECT CONVERT(date, 0)
Sản xuất
Chuyển đổi rõ ràng từ kiểu dữ liệu int đến ngày không được phép.
Bởi vì nó không phải là một chuyển đổi được hỗ trợ
trong khi
SELECT CONVERT(datetime, 0)
Trả về
Tháng 1, 01 1900 00:00:00
Vì vậy, có, nó kỳ lạ và tùy tiện, nhưng thực sự được ghi lại và giải thích.