Tôi đang gặp sự cố với một số truy vấn máy chủ SQL. Hóa ra rằng tôi có một bảng với các trường "Attibute_Name" và "Attibute_Value", có thể thuộc bất kỳ loại nào, được lưu trữ trong varchar. (Vâng ... Tôi biết.)Chuyển đổi thành datetime không thành công chỉ trên mệnh đề WHERE?
Tất cả các ngày cho một thuộc tính cụ thể dường như được lưu trữ định dạng "YYYY-MM-DD hh: mm: ss" (không chắc chắn 100% về điều đó, có hàng triệu các hồ sơ ở đây), vì vậy tôi có thể thực thi mã này mà không có vấn đề:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
Tuy nhiên, nếu tôi thực hiện đoạn mã sau:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
tôi sẽ nhận được lỗi sau: chuyển đổi thất bại khi chuyển đổi ngày và/hoặc thời gian từ chuỗi ký tự.
Làm thế nào nó không thành công trên mệnh đề where chứ không phải trên mệnh đề được chọn?
Một đầu mối:
Nếu thay vì lọc bởi ATTRIBUTE_NAME tôi sử dụng Attribute_ID thực tế lưu trữ trong cơ sở dữ liệu (PK) nó sẽ làm việc mà không có vấn đề.
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_ID = 15
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
Cập nhật Cảm ơn tất cả mọi người cho câu trả lời. Tôi thấy thật khó để chọn một câu trả lời đúng vì mọi người đã chỉ ra điều gì đó hữu ích để hiểu vấn đề. Nó chắc chắn phải làm với thứ tự thực hiện. Hóa ra truy vấn đầu tiên của tôi hoạt động chính xác vì mệnh đề WHERE được thực hiện trước, sau đó là SELECT. Truy vấn thứ hai của tôi không thành công vì lý do tương tự (vì Thuộc tính không được lọc, chuyển đổi không thành công khi thực thi cùng mệnh đề WHERE). Truy vấn thứ ba của tôi đã hoạt động vì ID là một phần của chỉ mục (PK), vì vậy nó được ưu tiên và nó đã khoan xuống kết quả về điều kiện đó trước tiên.
Cảm ơn!
là có một thuộc tính được gọi là 'sOmeDaTe' - trong trường hợp bạn đang sử dụng một trường hợp đối chiếu nhạy cảm? Có lẽ nó rối tung lên tham gia của bạn. – YetAnotherUser
Bạn dường như giả định một số loại đánh giá ngắn mạch hoặc đảm bảo thứ tự của các vị từ trong mệnh đề 'WHERE'. Điều này không được bảo đảm. Khi bạn có các kiểu dữ liệu hỗn hợp trong một cột như vậy, cách duy nhất để xử lý chúng là biểu thức 'CASE'. –
PHA là gì? Nếu PHA là một bảng khác với PA thì có vẻ như dữ liệu của PHA có một số hồ sơ không thể chuyển đổi, trong đó PA không có. – N0Alias