Запросы C, unixODBC, oracle и даты

#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 .

Надеюсь, это поможет…