Câu hỏi không rõ ràng, nhưng có vẻ như bạn đang cố gắng thực hiện đối sánh bình đẳng không trả về các hàng bạn mong đợi, vì vậy tôi đoán rằng vấn đề là phần nghìn giây đang có vấn đề. Có một số cách tiếp cận ở đây:
- định dạng cả hai giá trị (dưới dạng varcharetc) bằng CONVERT:forCPU đắt, không thể sử dụng chỉ mục
- sử dụng DATEDIFF / DATEPART để thực hiện chúng - tương tự, nhưng không hoàn toàn không đắt tiền
- tạo một phạm vi để tìm kiếm giữa
Tùy chọn thứ 3 hầu như luôn luôn hiệu quả nhất, vì nó có thể tận dụng tốt việc lập chỉ mục và không yêu cầu khối lượng CPU lớn.
Ví dụ:trong phần trên, vì độ chính xác của bạn là giây *, tôi sẽ sử dụng:
DECLARE @end datetime
SET @end = DATEADD(ss,1,@p_date)
sau đó thêm WHERE của biểu mẫu:
WHERE column_datetime >= @p_date AND column_datetime < @end
Điều này sẽ hoạt động tốt nhất nếu bạn có chỉ mục được phân cụm trên column_datetime, nhưng vẫn sẽ hoạt động tốt nếu bạn có chỉ mục không được phân cụm trên column_datetime.
[* =nếu @p_date bao gồm mili giây, bạn cần suy nghĩ thêm về việc có nên cắt bớt những mili giây đó qua DATEADD
hay không hoặc thực hiện một phạm vi nhỏ hơn, v.v.]