sql - tablas - DB2, al intentar calcular la diferencia entre la marca de tiempo proporcionada y la almacenada, aparece el error ''La invocación de la función es ambigua''
la columna en field list es ambigua (1)
Hay varias versiones sobrecargadas de la función DAYS()
, que aceptan parámetros con diferentes tipos de datos: DATE
, TIMESTAMP
y VARCHAR
. Cuando utiliza un marcador de parámetro sin tipo ( DAYS(?)
) El compilador de consulta no puede determinar qué versión de la función usar en la consulta.
Puede especificar el tipo de datos del parámetro explícitamente para la compilación: DAYS(CAST(? AS TIMESTAMP))
. Alternativamente, si está utilizando una versión reciente de DB2 para LUW (9.7 y superior), puede establecer la variable de registro de DB2:
db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
para decirle al compilador que debe aplazar la llamada PREPARE hasta el momento de ejecución de la consulta, cuando ya se conocen los tipos de datos de parámetro.
Esta es mi secuencia sql de la cual preparo una declaración:
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 = ?
rellenar valores con el siguiente código:
ps.setTimestamp(1, new Timestamp(...));
ps.setTimestamp(2, new Timestamp(...));
ps.setTimestamp(3, new Timestamp(...));
ps.setTimestamp(4, new Timestamp(...));
ps.setInt(5, ...);
Y obtén una excepción:
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE = -245, SQLSTATE = 428F5, SQLERRMC = DAYS; 1, DRIVER = 4.16.53
Cuando lo ejecuto directamente desde el navegador SQL funciona sin problemas:
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;
Donde hay un error?
Gracias.
La fórmula de PS para calcular la diferencia de tiempo se toma de este artículo: Conceptos básicos de DB2: Diversión con fechas y horas