Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao YEAR không thành công với lỗi chuyển đổi từ Ngày?

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
    



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi chuỗi kết nối động

  2. Làm cách nào để trả về nhiều tập kết quả với SqlCommand?

  3. SQL Server - Từ kinh độ và vĩ độ đến kiểu dữ liệu hình học

  4. Sử dụng SQL 2005 Pivot

  5. CTE trong mệnh đề Từ của Truy vấn SQL