簡體   English   中英

為什么當我在 WHERE 子句上使用我的屬性時會出現轉換失敗錯誤,但當我不使用時它可以工作?

[英]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_CONVERTWHERE TRY_CONVERT(date,issuedate) IS NOT NULL

當然,真正的問題是你的設計。 不要將日期存儲在不是日期和時間數據類型的數據類型中。 修復你的設計,這個問題就不會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM