Как удалить ошибку "conversion failed" из этого SQL-запроса?
Вот урезанная версия запроса SQL Server 2012, который я использую для получения всех пользователей в возрасте от 25 до 34 лет. В моем столе,
1. колонка "обратная связь" имеет тип VarChar и хранит дату рождения пользователя в виде VarChar в формате dd-mm-yyyy.
2. столбец " FeedbackDate "имеет тип DateTime и в основном является датой, когда пользователь сообщил мне свой DOB в форме" обратной связи", которую я храню в столбце" обратная связь".
WITH AgeCTE AS ( SELECT CASE WHEN DATEADD(yy, DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate), CONVERT(DATETIME, Feedback)) < FeedbackDate THEN DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) ELSE DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) - 1 END AS Age FROM FeedbackTable ) SELECT COUNT(*) AS [25To34] FROM AgeCTE WHERE (Age >= 25) AND (Age <= 34)
При выполнении этого запроса я получаю следующую ошибку:
Conversion failed when converting date and/or time from character string.
ОБНОВЛЕНИЕ:
Просто чтобы избежать какой-либо путаницы, вот полный SQL-запрос, который я использую:
WITH AgeCTE AS ( SELECT CASE WHEN DATEADD(yy, DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate), CONVERT(DATETIME, Feedback)) < FeedbackDate THEN DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) ELSE DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) - 1 END AS Age FROM FeedbackTable INNER JOIN FeedbackDetailsTable ON FeedbackDetailsTable.FeedbackId = FeedbackTable.FeedbackId INNER JOIN QuestionsTable ON QuestionsTable.QuestionId = FeedbackDetailsTable.QuestionId INNER JOIN QuestionTypesTable ON QuestionTypesTable.QuestionTypeId = QuestionsTable.QuestionTypeId WHERE (FeedbackTable.ClientId = 1) AND (QuestionTypeName = 'DateOfBirth') AND (Feedback != '-') ) SELECT COUNT(*) AS [18To24] FROM AgeCTE WHERE (Age >= 25) AND (Age <= 34)
Пожалуйста, помогите.
С уважением,
Варун
Что я уже пробовал:
Я попытался привести возраст в предложении WHERE к int. Но и это не работает.
Кроме того, когда я пытаюсь выполнить внутренний запрос, он выполняется успешно, что показывает, что формат дат не является проблемой до тех пор, пока этот внутренний запрос не будет выполнен.
Например, когда я выполняю следующий запрос:
SELECT CASE WHEN DATEADD(yy, DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate), CONVERT(DATETIME, Feedback)) < FeedbackDate THEN DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) ELSE DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) - 1 END AS Age FROM FeedbackTable
Я получаю вывод как:
Возраст
---
23
33
35
8
и т.д...
Даже весь запрос с CTE работает, если я опущу последнее предложение WHERE. В частности, если я удалю раздел
WHERE (Age >= 25) AND (Age <= 34)и выполните следующий запрос:
WITH AgeCTE AS ( SELECT CASE WHEN DATEADD(yy, DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate), CONVERT(DATETIME, Feedback)) < FeedbackDate THEN DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) ELSE DATEDIFF(yy, CONVERT(DATETIME, Feedback), FeedbackDate) - 1 END AS Age FROM FeedbackTable ) SELECT COUNT(*) AS [25To34] FROM AgeCTE
Я получаю следующий вывод:
25то34
------
9
Я не могу понять, в чем проблема с предложением WHERE. Я где-то читал в интернете, что это может быть короткое замыкание, но не могу понять, как. Любая помощь будет оценена по достоинству.