none
Convertir varchar a datetime SQL Server

    Pregunta

  • Hola,

    quisiera saber como puedo convertir una columna de tipo varchar a datetime usando SQL Server

    Los registros vienen de la siguiente forma:
    01/07/2009 12:00:10.000 AM
    ...
    01/07/2009 01:26:40.000 PM

    DD/MM/YYYY HH:MM:SS.MMM [AM/PM]

    Tendré que modificar el campo antes de convertirlo para que sea un formato aceptado en SQL Server??

    saludos...
    viernes, 27 de noviembre de 2009 19:04

Respuestas

  • Hola.

    En referencia al otro hilo que tienes abierto, podrás comprobar que SQL Server te ofrece mucha más versatilidad que SSIS a la hora de manejar las conversiones entre fechas y cadenas. Una opción con la que te puedes sentir más cómodo es esa, realizar un volcado desde Excel a SQL Server a una tabla intermedia en la que los campos de tipo fecha sean tratados como cadenas y en un paso posterior, realizar el volcado a la tabla definitiva, fragmentando la cadena antes de transformarla a datetime, ya que la conversión de un formato DD/MM/YYYY HH:MM:SS [AM/PM] no es automático. Antes deberás pasarlo a YYYY/MM/DD. Así que en respuesta a tu segunda pregunta, sí, tendrás que cambiar el formato antes de insertarlo, pero esa conversión no es tan enrevesada como en Integration Services.

    declare @cad varchar(30)
    select @cad = '01/07/2009 12:00:10.000 AM'
    
    select @cad = substring(@cad, 7, 4) + '/' + substring(@cad, 4, 2) + '/' + substring(@cad, 1, 2) + ' ' + substring(@cad, 11, 16)
    
    select @cad
    
    select cast(@cad as datetime)

    Evidentemente, este paso intermedio tendrá una repercusión en el rendimiento, ya que insertas dos veces. Si no lo consigues, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    sábado, 28 de noviembre de 2009 8:43
    Moderador

Todas las respuestas

  • Hola
    Si te entendí, creo que esto es lo que estas buscando:

    declare @fec varchar(50)
    set @fec='01/07/2009 01:26:40.000 PM'

    select @fec

             01/07/2009 01:26:40.000 PM   ----- esto es un varchar

    select convert(datetime,@fec)

             2009-01-07 13:26:40.000  ---- esto es un datetime

    Saludos,

    viernes, 27 de noviembre de 2009 20:28
  • Hola.

    En referencia al otro hilo que tienes abierto, podrás comprobar que SQL Server te ofrece mucha más versatilidad que SSIS a la hora de manejar las conversiones entre fechas y cadenas. Una opción con la que te puedes sentir más cómodo es esa, realizar un volcado desde Excel a SQL Server a una tabla intermedia en la que los campos de tipo fecha sean tratados como cadenas y en un paso posterior, realizar el volcado a la tabla definitiva, fragmentando la cadena antes de transformarla a datetime, ya que la conversión de un formato DD/MM/YYYY HH:MM:SS [AM/PM] no es automático. Antes deberás pasarlo a YYYY/MM/DD. Así que en respuesta a tu segunda pregunta, sí, tendrás que cambiar el formato antes de insertarlo, pero esa conversión no es tan enrevesada como en Integration Services.

    declare @cad varchar(30)
    select @cad = '01/07/2009 12:00:10.000 AM'
    
    select @cad = substring(@cad, 7, 4) + '/' + substring(@cad, 4, 2) + '/' + substring(@cad, 1, 2) + ' ' + substring(@cad, 11, 16)
    
    select @cad
    
    select cast(@cad as datetime)

    Evidentemente, este paso intermedio tendrá una repercusión en el rendimiento, ya que insertas dos veces. Si no lo consigues, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    sábado, 28 de noviembre de 2009 8:43
    Moderador
  • Hola, ya utilicé el query que propusiste para tener la fecha en el formato: YYYY/MM/DD HH:MM:SS AM 

    Los campos quedaron de la siguiente forma:
    2009/06/20  01:00:00.000 AM

    Ahora quise utilizar lo siguiente para convertir nvarchar(255) a datetime

    • ALTER TABLE [Variables_con]
      ALTER COLUMN [Tiempo] [DateTime]

    • SELECT convert(datetime,[Variables_con])

    • select cast(@cad as datetime)
      


    En los 3 casos me marco error de desbordamiento aritmético.


    Quisiera saber si hay alguna forma de utilizar lo que viene en esta pagina:
    http://msdn.microsoft.com/en-us/library/ms186724.aspx
    Para hacer la conversión, ya que el formato que mas se acerca sería yyyy-mm-dd HH:mm:ss.fff  pero es de 24hrs.
    También esta este: mon dd yyyy hh:mm:ss:fffAM pero no se como cambiar MM a mon (JAN, FEB...)

    Espero alguien pueda ayudar,
    saludos.
    viernes, 04 de diciembre de 2009 21:24
  • Bueno lo que veo es que necesitas poner la columna de Tiempo como una columna DATETIME.

    Lo primero que yo haría sería realizar el cambio que hiciste al principio (cambiar las posiciones con substrings) pero adicionalmente a ello reemplazar los slash(/) por guiones (-) y esto hacerlo con una sentencia UPDATE. Esto te deja el formato listo para hacer el cast.

    Después de ello si deberías poder realizar el cambio de formato de la columna, sin embargo si alguna fecha te quedara mal, podría generarte errores al realizar la conversión, por tanto para evitar esto podrías validar los datos que quedaron mal, haciendo un SELECT utilizando la sentencia ISDATE sobre el campo de fechas.

    Adicionalmente y como solución alternativa puedes colocar estas líneas antes del comando convert

    SET LANGUAGE us_english;
    SET DATEFORMAT mdy;

    Estas sentencias te permitirían realizar los Convert sin errores de formatos.

    Checa estos consejos para ver si te funciona.

    Saludos



    I'm Addict to Knowledge


    • Editado Dnieto23 miércoles, 15 de agosto de 2012 22:28
    miércoles, 15 de agosto de 2012 21:56