問題是,如果您試圖將字符串轉換為日期,而表中的某些字符串無法轉換為日期,SQL Server可能仍會嘗試將其轉換,即使您的過濾器應該消除它們。這是因為SQL Server可以根據選擇的計劃(這解釋了為什么單獨選擇可能與選擇進入不同)在篩選之前或轉換之前自由執行轉換,而您對此幾乎沒有控制權。你能做的就是改變: datediff(DAY,convert(date,b.value,101),convert(date,getdate(),101)) To: CASE WHEN TRY_CONVERT(date, b.value, 101) IS NOT NULL THEN DATEDIFF(DAY, TRY_CONVERT(date, b.value, 101), CONVERT(date,GETDATE())) END 轉換GETDATE()時不需要樣式號,因為它不會存儲為像m/d/y這樣的區域性、不明確的字符串。事實上,你根本不需要轉換它;無論今天是什么時間,DATEDIFF如果你調整時間與否,都會產生相同的結果,因此: CASE WHEN TRY_CONVERT(date, b.value, 101) IS NOT NULL THEN DATEDIFF(DAY, TRY_CONVERT(date, b.value, 101), GETDATE()) END 您甚至可以簡化并完全去掉C