none
convertir nvarchar a datetime

    Question

  • Hola comunidad tengo la siguiente cadena '2011-11-23T19:54:42-06:00'.

    La quiero convertir a datetime y me salen errores tanto con cast como con convert.

     Select Cast('2011-11-23T19:54:42-06:00' as datetime)

    Msg 241, Level 16, State 1, Line 15
    Conversion failed when converting datetime from character string.

    Select convert(datetime, '2011-11-23T19:54:42-06:00')

    Msg 241, Level 16, State 1, Line 15
    Conversion failed when converting datetime from character string.

    ¿Alguna sugerencia?

    Tengo SQL Server 2005

    De antemano gracias

    Wednesday, March 14, 2012 6:59 PM

Answers

  • me da que eso en 2005 no te puede funcionar porque es un datetime en formato datetime offset que si mal no recuerdo es de 2008 en adelante

    Select Cast('2011-11-23T19:54:42-06:00' as datetimeoffset)

    si quieres conseguirlo en 2006, quita la T y quita el -06:00

    algo así

    Select cast(left(replace('2011-11-23T19:54:42-06:00','T',' '),len(replace('2011-11-23T19:54:42-06:00','T',' '))-6) as datetime)

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    Wednesday, March 14, 2012 7:33 PM
  • Me alegra que hayas encontrado solucion a tu problema.

    En cuanto a la respuesta de Miguel, estoy de acuerdo con lo sugerido excepto con eliminar la "T". La "T" es parte del formato ISO8601, y este formato es independiente del lenguaje en uso.

    Si no vas a convertir ese valor de fecha usando algun metodo como los brindados por el tipo de dato xml, entonces te recomiendo que separes el valor de "time zone" y lo adiciones o restes usando alguna funcion de fecha y/o tiempo, o que almacenes los valores por separdos fecha/tiempo y time zone, para que puedas saber exactamente lo que tenias.

    Ejemplo (convertir cadena a fecha/tiempo usando formato ISO8601):

    SELECT CONVERT(datetime, '2012-02-19T09:15:00', 126) AS dt;
    GO


    AMB

    Some guidelines for posting questions...

    • Marked as answer by JEduardoNL2 Monday, March 19, 2012 4:23 PM
    • Edited by HunchbackMVP Monday, March 19, 2012 5:41 PM
    Monday, March 19, 2012 1:14 PM

All replies

  • No sé exactamente qué significa ese "-06:00", pero si lo quitas la conversión se realiza sin problemas

    Wednesday, March 14, 2012 7:30 PM
  • me da que eso en 2005 no te puede funcionar porque es un datetime en formato datetime offset que si mal no recuerdo es de 2008 en adelante

    Select Cast('2011-11-23T19:54:42-06:00' as datetimeoffset)

    si quieres conseguirlo en 2006, quita la T y quita el -06:00

    algo así

    Select cast(left(replace('2011-11-23T19:54:42-06:00','T',' '),len(replace('2011-11-23T19:54:42-06:00','T',' '))-6) as datetime)

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    Wednesday, March 14, 2012 7:33 PM
  • ESTA ES LA SINTAXIS PARA UTILIZAR CAST Y CONVERT

      

    SELECT

    '2006-04-25T15:50:59.997' AS UnconvertedText,

    CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,

    CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;

    http://dbasqlserver.wordpress.com/

    Saludos

    http://msdn.microsoft.com/es-es/library/ms187928.aspx

    Wednesday, March 14, 2012 7:39 PM
  • En la version 2005 no tenemos como lidear con el time zone. Es en la version 2008 donde se introdujo el tipo de dato [datetimeoffset].

    Ejemplo:

    SELECT CONVERT(datetimeoffset, '2011-11-23T19:54:42-06:00') AS dt;
    GO

    Para SS 2005 trata de convertir la cadena a xml, hacer el casting usando funciones de xml, y luego convertir a un tipo de T-SQL. En xml si se reconoce el time zone.

    DECLARE @s varchar(50);
    SET @s = '2011-11-23T19:54:42-06:00';
    -- 2005
    SELECT CAST(@s AS xml).value('(./text())[1] cast as xs:dateTime?', 'datetime')
    GO


    AMB

    Some guidelines for posting questions...

    Wednesday, March 14, 2012 7:42 PM
  • Gracias a todos por tomarse la molestia, tomare como respuesta la de Miguel Egea Gómez.

    Saludos

    Sunday, March 18, 2012 11:14 PM
  • Me alegra que hayas encontrado solucion a tu problema.

    En cuanto a la respuesta de Miguel, estoy de acuerdo con lo sugerido excepto con eliminar la "T". La "T" es parte del formato ISO8601, y este formato es independiente del lenguaje en uso.

    Si no vas a convertir ese valor de fecha usando algun metodo como los brindados por el tipo de dato xml, entonces te recomiendo que separes el valor de "time zone" y lo adiciones o restes usando alguna funcion de fecha y/o tiempo, o que almacenes los valores por separdos fecha/tiempo y time zone, para que puedas saber exactamente lo que tenias.

    Ejemplo (convertir cadena a fecha/tiempo usando formato ISO8601):

    SELECT CONVERT(datetime, '2012-02-19T09:15:00', 126) AS dt;
    GO


    AMB

    Some guidelines for posting questions...

    • Marked as answer by JEduardoNL2 Monday, March 19, 2012 4:23 PM
    • Edited by HunchbackMVP Monday, March 19, 2012 5:41 PM
    Monday, March 19, 2012 1:14 PM
  • Gracias Hunchback, realmente me confundi al leer lo que escribiste, sin embargo el fragmento de código es muy claro y tendre en cuenta lo de no quitar la T.
    Monday, March 19, 2012 4:22 PM
  • Se me paso poner que chequees en los BOL por la funcion CONVERT. Pon atencion a los formatos 126 y 127.


    AMB

    Some guidelines for posting questions...

    Monday, March 19, 2012 5:42 PM