locked
Formato de fecha en paquete SSIS con archivos Excel

    Question

  • Hola.

    Tengo un paquete SSIS que importa y exporta registros desde y hacia archivos Excel.

    Primero, tengo un Excel del cual importo los registros para cargarlos en una tabla SQL. A estos registros le aplico una conversión a algunas columnas, como por ejemplo las que contengan fechas. Entonces si una fecha no es correcta re direcciona el registro a otro archivo Excel. El problema es que los registros que son cargados en este segundo archivo Excel no son exactamente igual, específicamente los campos de fecha, ya que son insertados con el formato mm/dd/aaaa, siendo que el archivo Excel original las fechas tienen el formato dd-mm-aaaa.

    Existe alguna forma de que el valor de cada campo se inserte tal cual esta en la fuente original, o dejarlo con un formato especifico?
    Friday, September 11, 2009 4:15 PM

Answers

  • Hola.

    Bueno, pero si lo vuelcas a SQL Server (y a texto también, pero quizá sea más fácil de comprobar en SQL Server), un campo smalldatetime no tiene formato, se lo has de dar tú al visualizarlo. Así, si guardas el valor en un smalldatetime, luego lo recuperas para mostrarlo como mejor te venga, si es dd/mm/aaaa, entonces sería:

    select convert(char(10), MiCampoFecha, 103)

    Si no le das un formato, lo que se muestre dependerá de un buen número de factores (configuración regional, idioma de la base de datos, etc).

    Eso por una parte. Por otra, SSIS (manejando expresiones, como una derived comlumn) es bastante más rígido que SQL Server. Si usas el tipo DT_DBDATE, las cadenas han de pasarse como yyyy-mm-dd para que puedan convertirse a fecha y al revés igual, si conviertes una fecha, obtienes yyyy-mm-dd. Y lo mismo con el resto. Así que si estás obteniendo ese formato al volcar concretamente a texto, entonces es que existe algo que está haciendo esa conversión.

    Y en resumen, si puedes almacenar la información en una tabla de SQL Server, vas a tener muchas más posibilidades de control y de tratamiento de la información que en formatos menos preparados para el almacenamiento de la información.


    Alberto López Grande.
    Friday, September 11, 2009 7:17 PM

All replies

  • Hola.

    Te recomiendo que en este caso manejes las fechas en formato de cadena, ya que el propio Excel puede estar realizando una conversión al realizar el volcado.

    Otra posibilidad es asegurar el formato de destino, utilizando una hoja de Excel con formato ya definido. Aún así, para este caso, yo lo haría con las cadenas. Recuerda que estás manejando errores, no realizando la presentación final de la información, con lo que la parte estética es secundaria frente a la funcional (administrar los errores en este caso).



    Alberto López Grande.
    Friday, September 11, 2009 5:11 PM
  • En resumen...

    Tengo un archivo Excel original que importo a una tabla SQL usando un paquete de importación. Al momento de programar este paquete, establecí que todas las columnas del archivo Excel fueran de tipo texto (las planillas no están estandarizadas, así que preferí dejar todo como texto). Luego hago una transformación de las columnas para que puedan insertarse en la tabla SQL. Esta transformación convierte las columnas correspondientes a tipo fecha y las de texto lo mismo, para insertarlas correctamente en la tabla final. Si la transformación de alguna fecha falla, entonces redirecciono ese registro a otro archivo Excel. La idea es que los valores del registro sean idénticos al Excel original, para que así el usuario pueda identificar el registro en el archivo original y realizar la corrección.

    Pero como dije anteriormente, al momento de pasar el registro erróneo al nuevo archivo, este queda con el formato de fecha mm/dd/aaaa.

    Usando SSIS, existe alguna función o método para combiar el formato de salida? o que sea identico al original.


    Si en vez de pasar el registro erroneo a una planilla Excel lo paso a otra tabla SQL o un TXT tengo el mismo problema.
    Friday, September 11, 2009 6:01 PM
  • Hola.

    Bueno, pero si lo vuelcas a SQL Server (y a texto también, pero quizá sea más fácil de comprobar en SQL Server), un campo smalldatetime no tiene formato, se lo has de dar tú al visualizarlo. Así, si guardas el valor en un smalldatetime, luego lo recuperas para mostrarlo como mejor te venga, si es dd/mm/aaaa, entonces sería:

    select convert(char(10), MiCampoFecha, 103)

    Si no le das un formato, lo que se muestre dependerá de un buen número de factores (configuración regional, idioma de la base de datos, etc).

    Eso por una parte. Por otra, SSIS (manejando expresiones, como una derived comlumn) es bastante más rígido que SQL Server. Si usas el tipo DT_DBDATE, las cadenas han de pasarse como yyyy-mm-dd para que puedan convertirse a fecha y al revés igual, si conviertes una fecha, obtienes yyyy-mm-dd. Y lo mismo con el resto. Así que si estás obteniendo ese formato al volcar concretamente a texto, entonces es que existe algo que está haciendo esa conversión.

    Y en resumen, si puedes almacenar la información en una tabla de SQL Server, vas a tener muchas más posibilidades de control y de tratamiento de la información que en formatos menos preparados para el almacenamiento de la información.


    Alberto López Grande.
    Friday, September 11, 2009 7:17 PM