none
pasar numero a fecha en una tabla con datos RRS feed

  • Pregunta

  • hola amigos...

    les comento que tengo una tabla "PERSONAS", la cual esta llena de datos...el problema es que me la pasaron con la columna "fecha_nacimiento" con formato numeric, y yo la necesito como date, y no sé cómo convertir esa columna en fechas sin que se borren los datos...

    por ejemplo está asi:

    fecha_nacimiento

          19860812

    y yo la necesito asi:

    fecha_nacimiento

         1986-12-08

    agradezco desde ya su ayuda...saludos

    miércoles, 14 de marzo de 2012 12:40

Respuestas

  • Ok,  eso es una cuestión de formato y el formato no es de ninguna consecuencia para la capa de datos, o no debería serlo en todo caso.  Pero bueno, que la columna no sea datetime o datetime2 sí es un problema.  Hay que usar siempre el tipo de datos correcto.

    Si la instrucción Alter Tabla Alter Column Columna datetime2 Null borra los campos, el asunto es sencillo:  Copie las fechas junto con las claves primarias a una tabla temporal antes de hacer el cambio.  Idealmente, utilice tipo datetime2 en la tabla temporal.  ¿Cómo convertir a fecha?  Manipulando una cadena de texto:

    With t (clavePrimaria, FN)
    As
    (
        Select
            clavePrimaria
            , Cast(fecha_nacimiento As nvarchar(50)) As FN
        From Tabla
    )
    Select Into #TablaTemp
        clavePrimaria
        , Cast(Substring(FN, 1, 4) + N'-' + Substring(FN, 7, 2) + N'-' + Substring(FN, 5, 2) As datetime2) As FN
    From t
    ;


    Jose R. MCP

    miércoles, 14 de marzo de 2012 13:09
  • Primero comprueba que todos los valores pueden ser convertidos a fecha.

    select *
    from T
    where isdate(convert(char(8), fecha_nacimiento)) = 0;

    Si este query no devuelve alguna fila, entonces adiciona otra columna de tipo [date] o [datetime], actualiza la columna con el valor correspondiente, pon la marca NULL en la columna fecha_nacimiento, cambio el tipo de dato a [date] o [datetime], actualiza la columna con el valor de la columna que adicionastes, y luego eliminas la columna que adicionastes.

    Otra forma seria cambiar el tipo de dato de la columna fecha_nacimiento a caracter char(8), y luego cambiarla a [date] o [datetime]. Para eso se debe tener el mismo formato YYYYMMDD en todos los valores numericos.

    Ejemplo:

    USE tempdb;
    GO
    CREATE TABLE T (
    dt int NOT NULL
    );
    GO
    INSERT INTO T (dt)
    VALUES (20120101), (20120314);
    GO
    SELECT * FROM T;
    GO
    ALTER TABLE T
    ALTER COLUMN dt char(8) NOT NULL
    GO
    SELECT * FROM T;
    GO
    ALTER TABLE T
    ALTER COLUMN dt date NOT NULL
    GO
    SELECT * FROM T;
    GO
    DROP TABLE T;
    GO


    AMB

    Some guidelines for posting questions...

    miércoles, 14 de marzo de 2012 13:32

Todas las respuestas

  • Ok,  eso es una cuestión de formato y el formato no es de ninguna consecuencia para la capa de datos, o no debería serlo en todo caso.  Pero bueno, que la columna no sea datetime o datetime2 sí es un problema.  Hay que usar siempre el tipo de datos correcto.

    Si la instrucción Alter Tabla Alter Column Columna datetime2 Null borra los campos, el asunto es sencillo:  Copie las fechas junto con las claves primarias a una tabla temporal antes de hacer el cambio.  Idealmente, utilice tipo datetime2 en la tabla temporal.  ¿Cómo convertir a fecha?  Manipulando una cadena de texto:

    With t (clavePrimaria, FN)
    As
    (
        Select
            clavePrimaria
            , Cast(fecha_nacimiento As nvarchar(50)) As FN
        From Tabla
    )
    Select Into #TablaTemp
        clavePrimaria
        , Cast(Substring(FN, 1, 4) + N'-' + Substring(FN, 7, 2) + N'-' + Substring(FN, 5, 2) As datetime2) As FN
    From t
    ;


    Jose R. MCP

    miércoles, 14 de marzo de 2012 13:09
  • Primero comprueba que todos los valores pueden ser convertidos a fecha.

    select *
    from T
    where isdate(convert(char(8), fecha_nacimiento)) = 0;

    Si este query no devuelve alguna fila, entonces adiciona otra columna de tipo [date] o [datetime], actualiza la columna con el valor correspondiente, pon la marca NULL en la columna fecha_nacimiento, cambio el tipo de dato a [date] o [datetime], actualiza la columna con el valor de la columna que adicionastes, y luego eliminas la columna que adicionastes.

    Otra forma seria cambiar el tipo de dato de la columna fecha_nacimiento a caracter char(8), y luego cambiarla a [date] o [datetime]. Para eso se debe tener el mismo formato YYYYMMDD en todos los valores numericos.

    Ejemplo:

    USE tempdb;
    GO
    CREATE TABLE T (
    dt int NOT NULL
    );
    GO
    INSERT INTO T (dt)
    VALUES (20120101), (20120314);
    GO
    SELECT * FROM T;
    GO
    ALTER TABLE T
    ALTER COLUMN dt char(8) NOT NULL
    GO
    SELECT * FROM T;
    GO
    ALTER TABLE T
    ALTER COLUMN dt date NOT NULL
    GO
    SELECT * FROM T;
    GO
    DROP TABLE T;
    GO


    AMB

    Some guidelines for posting questions...

    miércoles, 14 de marzo de 2012 13:32