C, unixODBC, oracle и Date запросы - PullRequest
       18

C, unixODBC, oracle и Date запросы

0 голосов
/ 05 октября 2011

У меня запрос типа

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, &gps);

the?будут заменены значениями с помощью следующей команды:

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, но это тоже не помогло.

Надеюсь, кто-нибудь мне поможет.

Заранее спасибо.Chris

1 Ответ

0 голосов
/ 05 октября 2011

Отправляете ли вы тип данных DATE в запрос Oracle или дату, представленную в строке?

Со стороны Oracle, если вы отправляете дату в строковой переменной, вам нужно использовать функцию оракула "TO_DATE" (http://www.techonthenet.com/oracle/functions/to_date.php), чтобы затем преобразовать строку обратно в дату для использования в ваш оператор SQL (при условии, что startDate или startTime / endTime являются столбцами DATE в базе данных).

Ваш первый пример SQL должен быть:

SELECT x 
  FROM tableName 
 WHERE startDate <= TO_DATE(now, '<date-format>'); 

Если бы переменная "сейчас" была строкой, содержащей '05 -OCT-2011 16:15:23 '(включая часть времени), то to_date будет:

TO_DATE(now, 'DD-MON-YYYY HH24:MI:SS')

Если вы сравниваете строку с датой и не указываете формат этой даты, Oracle будет использовать параметры NLS по умолчанию и попытаться применить этот формат. Поэтому всегда целесообразно указывать формат даты с помощью TO_DATE.

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

...