我需要將字段過濾爲日期,但該字段未輸入日期或日期時間。在未輸入日期的日期字段上過濾
SELECT champ_save_id, element_id, valeur
FROM g_champ_save AS cs
INNER JOIN g_champ AS c ON cs.champ_id = c.champ_id
WHERE cs.valeur <> '' AND NOT cs.valeur IS NULL
AND c.champ_code = 'qualif_valide_qualif_fin'
AND CONVERT(datetime, cs.valeur, 103) <= @filterdate
它拋出一個錯誤(Conversion failed when converting datetime from character string
),除非我的評論的最後一行。
據我所知,SQL優化器首先在每個valeur
字段上執行CONVERT
函數,然後在其他條件下過濾,然後進行連接。所以它會嘗試CONVERT
字段中的「常規」文本,所以它當然不起作用。
我嘗試過一個CTE,但它做的事情完全一樣。
WITH valeurs AS (
SELECT champ_save_id, element_id, valeur
FROM g_champ_save AS cs
INNER JOIN g_champ AS c ON cs.champ_id = c.champ_id
WHERE cs.valeur <> '' AND NOT cs.valeur IS NULL
AND c.champ_code = 'qualif_valide_qualif_fin'
AND ISDATE(convert(datetime, cs.valeur, 103)) = 1
)
SELECT * FROM valeurs
WHERE CONVERT(datetime, valeur, 103) <= @filterdate
你有什麼想法,這將讓我切切第一返回一個包含日期字段,然後過濾他們?
該表的設計類似(縮短清晰度):
CREATE TABLE g_champ (
champ_id int IDENTITY(1,1) NOT NULL,
type_id int NOT NULL, -- defines the type : text, checkbox, date, etc
champ_code nvarchar(50) NULL,
champ_label nvarchar(max) NULL
)
CREATE TABLE g_champ_save (
champ_save_id int IDENTITY(1,1) NOT NULL,
champ_id int NOT NULL,
element_id int NULL,
valeur nvarchar(max) NULL
)
感謝
CONVERT(datetime,cs.valeur,103)導致錯誤。請檢查該列中的數據,值應該是datetime,即2012013或某個日期值字符串可以轉換爲DateTime。 – 2012-02-13 14:06:19