我有一個如下表:
名稱:VW_問卷
| QuestionnaireId (int) (pk) | 問題 ID(整數) | 問題(varchar) | 回應(varchar) | 標記(varchar) |
|---|---|---|---|---|
| 1 | 1 | 你有幾節課? | 4 | 無效的 |
| 2 | 2 | 你第一天上課是什么時候? | 2022-09-01 | SP1 |
| 3 | 1 | 你有幾節課? | 9 | 無效的 |
| 4 | 2 | 你第一天上課是什么時候? | 2022-10-01 | SP1 |
以下代碼有效:
SELECT Question, Response
From VW_Questionnaire
WHERE QuestionId = 2
AND CAST(Response AS Date) < SELECT (CURRENT_TIMESTAMP)
下面的代碼拋出一個錯誤:
SELECT Question, Response
From VW_Questionnaire
WHERE Tag = 'SP1'
AND CAST(Response AS Date) < SELECT (CURRENT_TIMESTAMP)
從字串轉換日期和/或時間時轉換失敗。
似乎在第一個示例中,它首先過濾到 WHERE QuestionId = 2,然后它成功地可以 CAST Response AS Date。
但是,在第二個示例中,它似乎試圖在過濾到 WHERE Tag = 'SP1' 之前將回應轉換為日期。
我什至嘗試使用 CTE 執行此操作,在 CTE 中我對 WHERE Tag = 'SP1' 進行過濾,然后從該過濾表和 CAST Response AS 日期中進行選擇。我仍然遇到轉換錯誤。
知道為什么會這樣嗎?
uj5u.com熱心網友回復:
SQL 是一種宣告性語言。這意味著服務器可以在它認為合適的時候自由地重新排序你的謂詞,以便命中索引并提高性能。
因此,您不能依賴按從左到右的順序執行的謂詞。相反,您可以只使用TRY_CAST,這將消除任何無效值
SELECT Question, Response
FROM VW_Questionnaire
WHERE QuestionId = 2
AND TRY_CAST(Response AS Date) < CURRENT_TIMESTAMP;
請注意,關于重新排序的要點甚至適用于派生表和視圖。例如,您可能仍然會在此版本中遇到錯誤:
SELECT Question, Response
FROM (
SELECT *
FROM VW_Questionnaire
WHERE QuestionId = 2
) v
WHERE CAST(Response AS Date) < CURRENT_TIMESTAMP;
保證從左到右評估的唯一構造是CASE(甚至該保證僅適用于標量值,而不適用于聚合)。
我強烈建議您首先確保您的資料格式正確,因此您不需要轉換它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507794.html
上一篇:在一個表中創建帶有日期的視圖
