Problema con los parámetros de un origen de flujo de datos OLEDB

Problema con los parámetros de un origen de flujo de datos OLEDB Carlos 5 May, 2014 - 23:24

Estoy preparando una carga de un Data Warehouse con Integration Services de un SQL Server 2008, y me he encontrado un problema con los parámetros de un origen de flujo de datos OLEDB de SSIS que no he podido resolver, yo le veo pinta de bug, pero lo planteo aquí por si alguien también se lo ha encontrado y me puede iluminar.

En una tarea de flujo de datos, tengo el origen de flujo de datos de OLEDB definido con una select que incluye un parámetro, que es el valor de una variable FechaActual de tipo DateTime, y que en el proceso de carga contiene la fecha actual.

La tabla sobre la que se ejecuta la consulta contiene registros con fechas hasta el día actual, y la sentencia select del origen es la siguiente:

select * from ax_almacenlote
where DATEDIFF(day,max_createddatetime,?)=0
or DATEDIFF(day,max_modifieddatetime,?)=0

 

El resultado esperado serían los registros de esta tabla con fecha de creación o modificación a día de hoy (FechaActual), pero, aunque he comprobado que los registros existen, el flujo de datos no devuelve ningún registro.

Lo más curioso es que después de hacer un montón de pruebas me doy cuenta de que si le añado 2 días a la comparación de fechas obtengo el resultado que esperaba, es decir, los registros creados o modificados en el día actual. Esta sería la Select que me saca estos registros:

select * from ax_almacenlote
where DATEDIFF(day,max_createddatetime,?)<3
or DATEDIFF(day,max_modifieddatetime,?)<3

Curioso no? Alguien me puede explicar porqué hay que añadir 2 días para que funcione esta comparación de fechas? Yo no le encuentro la lógica.

 

Para asegurarme de que no es un tema de la base de datos, o de la consulta, he capturado las queries que se generan en SQL Server, y los resultados siguen indicando que el problema está en la parte de Integration Services. Estas son las queries de cada caso:

Primero, esta es la consulta de base de datos que he intentado parametrizar y que, poniénle la fecha actual donde va el parámetro de SSIS devuelve correctamente los registros creados o modificados en el día actual, a la consulta o a los datos no se les puede echar la culpa:

select * from ax_almacenlote  
where DATEDIFF(day,max_createddatetime,getdate())=0  
   or DATEDIFF(day,max_modifieddatetime,getdate())=0

Después, al ejecutar el proceso con la consulta inicial en el origen OLEDB, la que no devuelve nada, la base de datos muestra esta select:

select * from ax_almacenlote  
where DATEDIFF(day,max_createddatetime,@P1)=0  
   or DATEDIFF(day,max_modifieddatetime,@P2)=0

Finalmente, al añadir los dos días a la comparación para que el flujo retorne los datos del día actual, esta es la sentencia SQL que muestra la base de datos como ejecutada:

select * from ax_almacenlote  
where DATEDIFF(day,max_createddatetime,@P1)<3  
   or DATEDIFF(day,max_modifieddatetime,@P2)<3

Si alguien lo entiene le agradezco que me lo explique porque yo no le veo ningún sentido.

 

 

Puede ser porque el formato de fecha que está enviando a la select está girada porque la envia en formato texto.

Por ejemplo:
En mi caso, si hago un "select getdate()" me devuelve: "09/05/14 18:13:23"

Acto seguido, ejecuto la select tuya con lo que me devuelve el getdate():

select * from entidades where DATEDIFF(day,comodin10,'09/05/14 18:13:23')=0

El resultadoes un frustrante "0 Rows"

Pero si giras el mes y el año devuelve los registros que tiene que devolver:

select * from entidades where DATEDIFF(day,comodin10,'05/09/14 18:13:23')=0

Resultado "698 Rows"

 

Vale, seguro que los tiros van por ahí, pero a mi la select ejecutada directamente contra la base de datos me devuelve los registros que espero, la select ya está bien para el formato de fecha que utiliza la base de datos.

¿Puede ser que SSIS o el driver de OLEDB cambien el formato de la fecha?

 

En respuesta a por Carlos

Podría ser. Para asegurarte de que el formato de fecha es el que esperas puedes probar a especificarlo, en la base de datos, o mejor en el componente, antes de la select. Algo así:

set dateformat dmy;
declare @fecha datetime
set @fecha = getdate()

select *
from Mitabla
where DATEDIFF(day,CampoDeFecha,@fecha)=0