SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Ошибка в динамическом запросе (Ошибка при использовании переменных даты в динамическом запросе)
Ошибка в динамическом запросе [сообщение #5864] Thu, 23 January 2025 09:07 Переход к следующему сообщению
mshp в настоящее время не в онлайне  mshp
Сообщений: 2
Зарегистрирован: January 2025
Junior Member
Добрый день.

Проблема в следующем. Есть элементарный запрос вида

FOR
SELECT COUNT (TABLE1.ID) FROM TRUP WHERE (TABLE1.DATE_POST BETWEEN T_POST_MIN AND T_POST_MAX)
INTO :RESULT
DO
SUSPEND;

В таком виде все нормально работает.


Если же представить это в виде динамического запроса

VR_SQL = 'SELECT COUNT (TABLE1.ID) FROM TABLE1 WHERE (TABLE1.DATE_POST BETWEEN ' || T_POST_MIN || ' AND ' || T_POST_MAX || ')';
FOR
EXECUTE STATEMENT :VR_SQL
INTO :RESULT
DO
SUSPEND;

Выдает ошибку "Only one operand can be of type TIMESHTAMP".

Подскажите, пожалуйста, в чем может быть проблема? Где можно поискать решение?
Re: Ошибка в динамическом запросе [сообщение #5865 является ответом на сообщение #5864] Thu, 23 January 2025 10:57 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время в онлайне  hvlad
Сообщений: 365
Зарегистрирован: August 2022
Senior Member
Эта ошибка выдаётся когда складываются два таймстампа и не имеет никакого отношения к данному запросу.
Посему нужно навести порядок с используемыми fbclient.dll и firebird.msg.
И\или внимательно посмотреть на текст "динамического "запроса.
Re: Ошибка в динамическом запросе [сообщение #5866 является ответом на сообщение #5864] Thu, 23 January 2025 13:47 Переход к предыдущему сообщениюПереход к следующему сообщению
Massaraksher в настоящее время не в онлайне  Massaraksher
Сообщений: 1
Зарегистрирован: January 2025
Junior Member
'SELECT COUNT (TABLE1.ID) FROM TABLE1 WHERE (TABLE1.DATE_POST BETWEEN ' || T_POST_MIN || ' AND ' || T_POST_MAX || ')';
раскладывается в
SELECT COUNT (TABLE1.ID) FROM TABLE1 WHERE (TABLE1.DATE_POST BETWEEN 21.01.2025 13:00:00 AND 23.01.2025 13:43:11)

А тебе надо
SELECT COUNT (TABLE1.ID) FROM TABLE1 WHERE (TABLE1.DATE_POST BETWEEN '21.01.2025 13:00:00' AND '23.01.2025 13:43:11')
попробуй вот так (внимание на кавычки)
'SELECT COUNT (TABLE1.ID) FROM TABLE1 WHERE (TABLE1.DATE_POST BETWEEN ''' || T_POST_MIN || ''' AND ''' || T_POST_MAX || ''')';

[Обновления: Thu, 23 January 2025 13:48]

Известить модератора

Re: Ошибка в динамическом запросе [сообщение #5867 является ответом на сообщение #5864] Thu, 23 January 2025 16:00 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 423
Зарегистрирован: August 2022
Senior Member
mshp писал(а) Thu, 23 January 2025 07:07
Где можно поискать решение?
Ищи по ключевым словам "использование параметров в запросах SQL". Не надо искать приключений с SQL injection себе на голову.
Re: Ошибка в динамическом запросе [сообщение #5868 является ответом на сообщение #5867] Fri, 24 January 2025 01:44 Переход к предыдущему сообщению
mshp в настоящее время не в онлайне  mshp
Сообщений: 2
Зарегистрирован: January 2025
Junior Member
Спасибо. Действительно не обратил внимания, что формат даты при формировании переменной запроса должен быть переведен в строку.
Предыдущая тема: Firebird-3.0.12.33787-0-x64. Неправильно считает размер текста на русском
Следующая тема: Полнотекстовый поиск для Firebird
Переход к форуму:
  


Текущее время: Thu Jan 30 22:33:25 GMT+3 2025

Общее время, затраченное на создание страницы: 0.00697 секунд