#c #odbc #oracle11g
#c #odbc #oracle11g
Вопрос:
У меня есть запрос типа
select x from tableName where startDate <= now;
Когда я запрашиваю базу данных без полей даты, все работает так, как ожидалось. Как только я начинаю использовать столбцы даты или метки времени в базе данных oracle, мои запросы ничего не возвращают или выдают ошибку.
Что я делаю:
snprintf(sql, sizeof(sql), "SELECT roomNo, userPass, adminPass, adminFlags, userFlags, bookId, is_locked, running_on_server FROM booking WHERE roomNo = '?' AND startTime <= { ts '?' } AND endTime >= { ts '?' } for update;");
stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, amp;gps);
что ? будут заменены значениями с помощью следующей команды:
SQLBindParameter(stmt, i 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(gps->argv[i]), 0, gps->argv[i], 0, NULL);
когда я выполняю запрос, я получаю сообщение об ошибке, что TS является недопустимым идентификатором [это была рекомендация другой платы, взятая из msdn, которая может вызвать эту ошибку]
но даже если я удалю его и отправлю только строку в базу данных, я получу пустой результат обратно. Я также пытался связать параметры как SQL_TIMESTAMP и SQL_DATE, но это тоже не помогло.
Надеюсь, кто-нибудь сможет мне помочь.
заранее спасибо. Крис
Ответ №1:
Отправляете ли вы тип данных ДАТЫ в запрос Oracle или дату, представленную в виде строки?
Со стороны Oracle, если вы отправляете дату в строковой переменной, вам нужно будет использовать функцию oracle «TO_DATE» (http://www.techonthenet.com/oracle/functions/to_date.php ), чтобы затем преобразовать строку w обратно в дату для использования в вашем SQL-операторе (при условии, что StartDate или startTime / EndTime являются столбцами ДАТЫ в базе данных).
Ваш первый пример SQL должен быть:
SELECT x
FROM tableName
WHERE startDate <= TO_DATE(now, '<date-format>');
Если бы переменная «now» была строкой, содержащей ’05-OCT-2011 16:15:23′ (включая временную часть), то to_date было бы:
TO_DATE(now, 'DD-MON-YYYY HH24:MI:SS')
Если вы сравните строку с датой и не укажете формат этой даты, Oracle будет использовать свои параметры NLS по умолчанию и попытается применить этот формат. Поэтому всегда разумно указывать формат даты с помощью TO_DATE .
Надеюсь, это поможет…