none
convertir formato de varchar a datetime RRS feed

  • Pregunta

  • Buenos días estimados amigos tengo una consulta 

    tengo un campo de tipo nvarchar(50) y tiene de datos = 13 de enero 2011

    hay alguna función para convertir esos datos en 13/01/2011

    pregunto por que tengo miles de registro y lo quiero hacer para todos. 

    Ayuda por favor...        USO SQL SERVER 2014 

    lunes, 30 de julio de 2018 16:37

Respuestas

  • Trata:

    SET LANGUAGE Spanish
    GO
    DECLARE @T table (
    col1 int NOT NULL IDENTITY,
    col2 varchar(50) NOT NULL
    );
    
    INSERT INTO @T (col2)
    VALUES
    	('13 de enero 2011'),
    	('14 de febrero 2011'), 
    	('20 de agosto 2011'),
    	('25 de marzo 2011');
    
    SELECT
    	T0.col1,
            T0.col2,
    	STUFF(T1.col1, T2.col1 + 5, T3.col1 - T2.col1 - 4, '') AS col3,
    	CONVERT(date, STUFF(T1.col1, T2.col1 + 5, T3.col1 - T2.col1 - 4, ''), 106) AS col4
    FROM
    	@T AS T0
    	CROSS APPLY
    	(VALUES (REPLACE(T0.col2, ' de ',  ' '))) AS T1(col1)
    	CROSS APPLY
    	(VALUES (PATINDEX('%[0-9] [a-zA-Z]%[0-9][0-9][0-9][0-9]', T1.col1))) AS T2(col1)
    	CROSS APPLY
    	(VALUES (PATINDEX('%[^0-9] [0-9][0-9][0-9][0-9]', T1.col1))) AS T3(col1)
    GO
    SET LANGUAGE English
    GO

    Tuve que cambiar el lenguaje porque aca usamos Ingles.

    El codigo elimina la parte " de " del valor de la cadena y luego encuentra la posicion donde comienza el nombre del mes y donde termina para dejar solo los primeros tres caracteres del mes.

    "13 de enero 2011" --> "13 enero 2011"

    Aca debemos eliminar las letras desde la posicion 7 (2 + 5) unos 2 caracteres (8 - 2 - 4).  Donde 8 es la posicion donde se encuentra "o 2011", 2, donde se encuentra "3 e" y 4 porque deseamos limpiar desde la posicion 2 mas los cuantro caracteres " ene".

    El valor resultante lo puedes convertir a fecha usando el estilo 106 (ver funcion CONVERT).


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    lunes, 30 de julio de 2018 20:11
  • ¿TODOS tienen la misma fecha o van variando? (13 de enero 2011)
    lunes, 30 de julio de 2018 18:10

Todas las respuestas

  • ¿TODOS tienen la misma fecha o van variando? (13 de enero 2011)
    lunes, 30 de julio de 2018 18:10
  • Va variando...

    ejemplo

    13 de enero 2011,

    14 de febrero 2011, 

    20 de agosto 2011,

    25 de marzo 2011

    lunes, 30 de julio de 2018 19:40
  • Trata:

    SET LANGUAGE Spanish
    GO
    DECLARE @T table (
    col1 int NOT NULL IDENTITY,
    col2 varchar(50) NOT NULL
    );
    
    INSERT INTO @T (col2)
    VALUES
    	('13 de enero 2011'),
    	('14 de febrero 2011'), 
    	('20 de agosto 2011'),
    	('25 de marzo 2011');
    
    SELECT
    	T0.col1,
            T0.col2,
    	STUFF(T1.col1, T2.col1 + 5, T3.col1 - T2.col1 - 4, '') AS col3,
    	CONVERT(date, STUFF(T1.col1, T2.col1 + 5, T3.col1 - T2.col1 - 4, ''), 106) AS col4
    FROM
    	@T AS T0
    	CROSS APPLY
    	(VALUES (REPLACE(T0.col2, ' de ',  ' '))) AS T1(col1)
    	CROSS APPLY
    	(VALUES (PATINDEX('%[0-9] [a-zA-Z]%[0-9][0-9][0-9][0-9]', T1.col1))) AS T2(col1)
    	CROSS APPLY
    	(VALUES (PATINDEX('%[^0-9] [0-9][0-9][0-9][0-9]', T1.col1))) AS T3(col1)
    GO
    SET LANGUAGE English
    GO

    Tuve que cambiar el lenguaje porque aca usamos Ingles.

    El codigo elimina la parte " de " del valor de la cadena y luego encuentra la posicion donde comienza el nombre del mes y donde termina para dejar solo los primeros tres caracteres del mes.

    "13 de enero 2011" --> "13 enero 2011"

    Aca debemos eliminar las letras desde la posicion 7 (2 + 5) unos 2 caracteres (8 - 2 - 4).  Donde 8 es la posicion donde se encuentra "o 2011", 2, donde se encuentra "3 e" y 4 porque deseamos limpiar desde la posicion 2 mas los cuantro caracteres " ene".

    El valor resultante lo puedes convertir a fecha usando el estilo 106 (ver funcion CONVERT).


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    lunes, 30 de julio de 2018 20:11
  • Excelente repuesta es lo que buscaba, pero ahora que lo estoy probando se me da el caso que me encontro con registro que tienen  otro caracter "de"

    ejemplo hay registro como:

    13 de agosto 2011

    13 de agosto de 2011

    Ahora la pregunta es como omito el otro "de" en caso que lo tenga para que mi consulta me funcione correctamente?

    Le agradeceria su ayuda.

    Gracias.

    jueves, 2 de agosto de 2018 0:21