Вопрос или проблема
В SQL у меня возникает ошибка
Некорректный синтаксис рядом с ‘<‘.
SELECT *
FROM TableName
WHERE CStatus="Active"
AND ServiceStatus="Active"
AND DATEDIFF(day, OnDate, OffDate) > 0
AND CASE WHEN EOMONTH(CA.OnDate) = 31 THEN DATEDIFF(day, OnDate, OffDate) <= 31 ELSE DATEDIFF(day, OnDate, OffDate) <= 30 END
Я пытаюсь вставить конструкцию CASE в мое условие WHERE, но получаю ошибку:
Некорректный синтаксис рядом с ‘>’.
Я хочу сравнить, если месяц OnDate имеет 31 день, тогда 31 день, иначе 30 дней.
Ответ или решение
Когда вы сталкиваетесь с ошибкой "Incorrect syntax near ‘<‘" при использовании выражения CASE в WHERE-классе SQL, это часто указывает на проблему с форматированием логического выражения. Давайте подробно разберем вашу проблему и предложим правильное решение.
Анализ текущего запроса
Ваш SQL-запрос выглядит следующим образом:
SELECT *
FROM TableName
WHERE CStatus = "Active"
AND ServiceStatus = "Active"
AND DATEDIFF(day, OnDate, OffDate) > 0
AND CASE WHEN EOMONTH(CA.OnDate) = 31 THEN DATEDIFF(day, OnDate, OffDate) <= 31 ELSE DATEDIFF(day, OnDate, OffDate) <= 30 END
Проблема с конструкцией CASE
Ваша попытка использовать конструкцию CASE в WHERE-классе неверна. В SQL конструкция CASE возвращает значение, а не логическое условие. То есть, вам необходимо вернуть True
или False
, а не результат вычисления, чтобы правильно использовать его в условии WHERE.
Правильный подход
Чтобы правильно провести проверку, используйте конструкцию IF-ELSE (или AND/OR) вместо CASE. Вот как можно переписать ваш запрос:
SELECT *
FROM TableName
WHERE CStatus = 'Active'
AND ServiceStatus = 'Active'
AND DATEDIFF(day, OnDate, OffDate) > 0
AND (
(EOMONTH(OnDate) = '2023-01-31' AND DATEDIFF(day, OnDate, OffDate) <= 31)
OR
(EOMONTH(OnDate) <> '2023-01-31' AND DATEDIFF(day, OnDate, OffDate) <= 30)
)
Примечания:
- Проверка на 31 день: Убедитесь, что вы используете правильный флаг для проверки последнего дня месяца.
- Используйте одинарные кавычки для строк: В SQL стандартом является использование одинарных кавычек для строковых значений (
'Active'
вместо"Active"
). - Проверьте тип данных: Убедитесь, что поля CStatus и ServiceStatus (и другие поля) имеют соответствующий тип данных, чтобы избежать дополнительных ошибок.
Заключение
Используя правильные логические операторы и условия, вы сможете избежать синтаксических ошибок и добиться желаемого результата. Если у вас есть дополнительные вопросы или вам требуется помощь с другими аспектами SQL-запросов, не стесняйтесь обращаться!