DB2, при попытке вычислить разницу между предоставленной и сохраненной меткой времени я получаю сообщение об ошибке "Вызов функции неоднозначен"

Это моя строка sql, из которой я готовлю оператор:

SELECT (DAYS(?) - DAYS(FROM)) * 86400 + (MIDNIGHT_SECONDS(?) -
           MIDNIGHT_SECONDS(FROM)) AS FROM_DIFF,
       (DAYS(?) - DAYS(TO)) * 86400 + (MIDNIGHT_SECONDS(?) - 
           MIDNIGHT_SECONDS(TO)) AS TO_DIFF
FROM CALENDAR.EVENTS WHERE ID = ?

заполните значения следующим кодом:

        ps.setTimestamp(1, new Timestamp(...));
        ps.setTimestamp(2, new Timestamp(...));
        ps.setTimestamp(3, new Timestamp(...));
        ps.setTimestamp(4, new Timestamp(...));
        ps.setInt(5, ...);

И получить исключение:

com.ibm.db2.jcc.am.SqlSyntaxErrorException: Ошибка SQL DB2: SQLCODE=-245, SQLSTATE=428F5, SQLERRMC=DAYS;1, ДРАЙВЕР=4.16.53

Когда я запускаю его непосредственно из браузера SQL, он работает безупречно:

SELECT 
    (DAYS('2015-05-05 00:00:00.0') - DAYS(FROM)) * 86400 + (MIDNIGHT_SECONDS('2015-05-05 00:00:00.0') - MIDNIGHT_SECONDS(FROM)) AS FROM_DIFF,
    (DAYS('2015-05-05 00:00:00.0') - DAYS(TO)) * 86400 + (MIDNIGHT_SECONDS('2015-05-05 00:00:00.0') - MIDNIGHT_SECONDS(TO)) AS TO_DIFF  
FROM CALENDAR.EVENTS WHERE ID = 1055;

Где ошибка?

Спасибо.

P.S. Формула расчета разницы во времени взята из этой статьи: Основы DB2: Веселье с датами и временем


person Anatoly    schedule 13.05.2015    source источник


Ответы (1)


Существует несколько перегруженных версий функции DAYS(), принимающих параметры с разными типами данных: DATE, TIMESTAMP и VARCHAR. При использовании маркера нетипизированного параметра (DAYS(?)) компилятор запросов не может определить, какую версию функции использовать в запросе.

Вы можете явно указать тип данных параметра для компиляции: DAYS(CAST(? AS TIMESTAMP)). В качестве альтернативы, если вы используете последнюю версию DB2 для LUW (9.7 и выше), вы можете задать переменную реестра DB2:

db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES

чтобы сообщить компилятору, что он должен отложить вызов PREPARE до времени выполнения запроса, когда типы данных параметров уже известны.

person mustaccio    schedule 13.05.2015
comment
Спасибо, первый вариант предпочтительнее, т.к. у меня не всегда есть доступ к БД - person Anatoly; 13.05.2015