none
Convertir char a datetime ¿cómo se hace? RRS feed

  • Pregunta

  • Hola a todos,

    Tengo en una tabla una columna que guarda la fecha y hora.  Tengo dos campos de tipo char y las fechas son almacenadas en cadenas como esta "20190618180000M" en el primer campo y como esta en el segundo "201910091543451"

    Debo llenar otra tabla con los valores de estos campos, pero los campos de la tabla destino son del tipo fecha (YYYY/mm/dd HH:mm:ss)

    Es posible convertir estos valores a formato fecha utilizando CONVERT o CAST.  He buscado información sobre esto y hay muchos ejemplos, pero ninguno que me muestre conversiones a partir de campos char con cadenas como las que les comento.

    De antemano gracias por su ayuda.

    Saludos,

    Aldo

    jueves, 17 de octubre de 2019 17:50

Respuestas

  • Hola Sergio,

    Gracias por tu respuesta, voy a realizarlo por el método que me sugieres.  Creo que es una buena opción y al final obtendré el resultado que necesito.

    Muchas graciasd

    jueves, 17 de octubre de 2019 18:32
  • Tengo en una tabla una columna que guarda la fecha y hora.  Tengo dos campos de tipo char y las fechas son almacenadas en cadenas como esta "20190618180000M" en el primer campo y como esta en el segundo "201910091543451"

    ¿Y qué significa el último carácter?   (M o 1)

    Dado que la función CAST() depende del ajuste LANGUAGE y/o DATEFORMAT, le sugiero que utilice la función CONVERT() e introduzca 120 como valor de estilo.

    Además de la sugerencia de Sérgio, propongo aquí otra utilizando la función CONVERT(). 

    -- código #1
    SELECT Dt,
           convert (datetime,
                    (left (Dt, 4) + '-' + substring (Dt, 5, 2) + '-' + substring (Dt, 7, 2) + ' ' 
                     + substring (Dt, 9, 2) + ':' + substring (Dt, 11, 2) + ':' + substring (Dt, 13, 2)),
                    120) as Dt_120
      from tabla;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz jueves, 17 de octubre de 2019 21:10
    • Propuesto como respuesta Pablo RubioModerator viernes, 18 de octubre de 2019 18:27
    • Marcado como respuesta Odlarhg martes, 22 de octubre de 2019 14:51
    jueves, 17 de octubre de 2019 20:53

Todas las respuestas

  • Si todas tus filas tienen el mismo patrón, puedes hacer uso de de SUBSTRINGs y formar el formato ANSI para generar un tipo DATETIME de la siguiente forma:

    declare @columna_varchar varchar(100) = '20190618180000M'
    
    select cast( LEFT( @columna_varchar , 8 ) + ' ' + SUBSTRING( @columna_varchar, 9, 2) + ':' + SUBSTRING( @columna_varchar, 11, 2) + ':' + SUBSTRING( @columna_varchar, 13, 2)   as DATETIME) 
    go
    
    declare @columna_varchar varchar(100) = '201910091543451'
    
    select cast( LEFT( @columna_varchar , 8 ) + ' ' + SUBSTRING( @columna_varchar, 9, 2) + ':' + SUBSTRING( @columna_varchar, 11, 2) + ':' + SUBSTRING( @columna_varchar, 13, 2) + '.' + SUBSTRING( @columna_varchar, 15,5)   as DATETIME) 
    
    Hasta donde sé, no puedes utilizar un CAST o CONVERT directo.


    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    jueves, 17 de octubre de 2019 18:20
  • Hola Sergio,

    Gracias por tu respuesta, voy a realizarlo por el método que me sugieres.  Creo que es una buena opción y al final obtendré el resultado que necesito.

    Muchas graciasd

    jueves, 17 de octubre de 2019 18:32
  • Tengo en una tabla una columna que guarda la fecha y hora.  Tengo dos campos de tipo char y las fechas son almacenadas en cadenas como esta "20190618180000M" en el primer campo y como esta en el segundo "201910091543451"

    ¿Y qué significa el último carácter?   (M o 1)

    Dado que la función CAST() depende del ajuste LANGUAGE y/o DATEFORMAT, le sugiero que utilice la función CONVERT() e introduzca 120 como valor de estilo.

    Además de la sugerencia de Sérgio, propongo aquí otra utilizando la función CONVERT(). 

    -- código #1
    SELECT Dt,
           convert (datetime,
                    (left (Dt, 4) + '-' + substring (Dt, 5, 2) + '-' + substring (Dt, 7, 2) + ' ' 
                     + substring (Dt, 9, 2) + ':' + substring (Dt, 11, 2) + ':' + substring (Dt, 13, 2)),
                    120) as Dt_120
      from tabla;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz jueves, 17 de octubre de 2019 21:10
    • Propuesto como respuesta Pablo RubioModerator viernes, 18 de octubre de 2019 18:27
    • Marcado como respuesta Odlarhg martes, 22 de octubre de 2019 14:51
    jueves, 17 de octubre de 2019 20:53
  • Hola,

    Te soy honesto, ignoro el significado de esos dos últimos caracteres.  La base de datos que estoy trabajando es de un sistema de Gestión de Documentos y Registros.  Las fechas de registro, vencimiento, última modificación, etc. las almacena en campos tipo char y no de fecha.  Supongo que internamente utiliza estos caracteres como un digito verificador o para controles específicos de los documentos que gestiona.

    Gracias por toda la ayuda.

    martes, 22 de octubre de 2019 14:51