Tôi giả sử rằng RValues
là một cột chuỗi của một số loại, vì một số lý do. Bạn nên khắc phục điều đó và lưu trữ dữ liệu ngày tháng bằng kiểu dữ liệu ngày tháng (rõ ràng là trong một cột riêng biệt với túi hỗn hợp này).
Nếu bạn không thể khắc phục điều đó, thì bạn có thể ngăn chặn những gì Damien đã mô tả ở trên bằng cách:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Điều này sẽ tạo nên "ngày" NULL
nếu SQL Server không thể tìm ra cách chuyển đổi nó thành một ngày.)
Bạn không thể ngăn điều này chỉ bằng cách thêm WHERE
, bởi vì SQL Server thường sẽ cố gắng chuyển đổi trong SELECT
danh sách trước khi thực hiện bộ lọc (tất cả phụ thuộc vào kế hoạch). Bạn cũng không thể buộc thứ tự các hoạt động bằng cách sử dụng truy vấn con, CTE, gợi ý thứ tự tham gia, v.v. Có một mục Kết nối mở về vấn đề này - họ" biết về vấn đề này "và" hy vọng sẽ giải quyết vấn đề này trong một phiên bản trong tương lai
. "
Thiếu biểu thức CASE, buộc SQL Server phải đánh giá kết quả ISDATE () trước khi cố gắng chuyển đổi ( miễn là không có tổng hợp nào trong bất kỳ nhánh nào ), bạn có thể:
- kết xuất các kết quả đã lọc vào bảng #temp, sau đó chọn từ bảng #temp đó và chỉ áp dụng chuyển đổi sau đó.
- chỉ cần trả lại chuỗi và coi nó như một ngày trên máy khách và kéo các phần NĂM / THÁNG, v.v. ra khỏi đó
- chỉ cần sử dụng thao tác chuỗi để kéo YEAR =LEFT (col, 4), v.v.
-
sử dụng
TRY_CONVERT()
vì tôi vừa nhận thấy bạn đang sử dụng SQL Server 2012:TRY_CONVERT(DATE, RValues) AS FechaFirma