Мне нужно отфильтровать поле как дату, но в поле не указывается дата или дата-время.
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 сначала выполняет функцию CONVERT
для каждого поля valeur
, а затем фильтрует другие условия, а затем присоединяется.Поэтому он пытается 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
)
Спасибо