[英]Why do I get a conversion failed error when I use my attribute on my WHERE clause but it works when I don't?
當我運行以下查詢時,為什么我的查詢返回結果:
SELECT MAX(CAST(IssueDate as Date))
FROM (SELECT IssueDate
FROM [Transient].[Commissions_TIB]
WHERE ISDATE(issuedate) = 1
GROUP BY IssueDate) t
但是,當我在 WHERE 子句中使用“IssueDate”屬性時,它無法從字符串轉換為日期?
SELECT MAX(CAST(IssueDate as Date))
FROM (SELECT IssueDate
FROM [Transient].[Commissions_TIB]
WHERE ISDATE(issuedate) = 1
GROUP BY IssueDate) t
WHERE CAST(IssueDate as Date) <= CAST(GETDATE() as date)
最有可能的是,您的表中存在無效的IssueDate
。 出於某種原因,SQL Server 似乎決定在內部謂詞之前應用外部謂詞。 我懷疑它與稱為謂詞下推的查詢規划器優化技術有關 - 在這里,這可能被認為是一個錯誤......
簡而言之:不要使用isdate()
。 無論如何它都不安全,因為它依賴於一些復雜(且未公開)的啟發式方法。 相反,請使用try_convert()
或try_cast()
,它們會立即檢查和轉換。
您的整個查詢可以簡化為:
SELECT MAX(TRY_CAST(IssueDate as Date))
FROM [Transient].[Commissions_TIB]
WHERE TRY_CAST(IssueDate as Date) <= CAST(GETDATE() as date)
因為ISDATE()
是一個糟糕的函數。 ISDATE(20200101)
,例如返回1
,但CONVERT(datetime, 20200101)
和CONVERT(date,20200101)
返回不同的錯誤。
如果您需要檢查其他數據類型是否有效,請使用TRY_CONVERT
: WHERE TRY_CONVERT(date,issuedate) IS NOT NULL
當然,真正的問題是你的設計。 不要將日期存儲在不是日期和時間數據類型的數據類型中。 修復你的設計,這個問題就不會發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.