none
Formato nvarchar D-M-YYYY a DateTime RRS feed

  • Pregunta

  • Hola buenos dias

    Una consulta, tengo dos tablas gemelas, una donde se carga un excel con datos, donde todo los campos son nvarchar, la otra tabla tiene las mismas columnas pero con restricciones y las columnas formateadas, el problema que tengo es que la primer tabla tiene en una columna como dato la siguiente fecha por ejemplo 9/2/2021 no encuentro manera de convertirla a datetime, ya que los formatos que usa sql server son de dos digitos, por ejemplo para este caso seria 09/02/2021, hay alguna manera de realizar la conversion del primer nvarchar a datetime?

    Muchas gracias

    Saludos

    jueves, 1 de julio de 2021 5:07

Respuestas

  • Hola AlejandroRicotti:

    El escenario:

    CREATE TABLE dbo.valoresDateTime (fecha nvarchar(100))
    Go
    Insert into dbo.valoresDateTime (fecha)
    values
    ('8/1/2021'),
    ('12/1/2021'),
    ('14/1/2021'),
    ('16/1/2021'),
    ('19/1/2021'),
    ('21/1/2021');
    GO

    Como te había mencionado, para esto Sql tiene

    Set dateFormat

    , de manera que se puede establecer para la consulta, cual es el formato.

    Set dateformat dmy;
    select cast(fecha as date) -- o cast(fecha as datetime)
    from dbo.valoresDateTime;


    Aunque mucho más interesante es el uso de try_cast.

    Insert into dbo.valoresDateTime (fecha)
    values
    ('castaña')

    Ahora tenemos una fila que nos estropea la consulta. 

    Set dateformat dmy;
    select Try_cast(fecha as datetime)
    from dbo.valoresDateTime;


    Además con try_cast podemos ver que el uso de set dateFormat es el esperado, ya que si pongo mdy

    Set dateformat mdy;
    select Try_cast(fecha as datetime)
    from dbo.valoresDateTime;

    Los valores devueltos son:

    Por supuesto existe también try_convert por si le queremos dar un formato a la fecha.

    try_cast

    https://docs.microsoft.com/es-es/sql/t-sql/functions/try-cast-transact-sql?view=sql-server-ver15

    Set dateformat

    https://docs.microsoft.com/es-es/sql/t-sql/statements/set-dateformat-transact-sql?view=sql-server-ver15

    viernes, 2 de julio de 2021 1:42

Todas las respuestas

  • Hola AlejandroRicotti:

    Quizá tienes que detallar mucho mejor el problema, porque a lo mejor las conclusiones son algo equivocadas.

    declare @fecha nvarchar(max)=N'9/2/2021'
    
    SELECT cast(@fecha as date)

    Se me ocurre, que si la fecha expuesta es otra que no esa, no encaje, que sea por problemas de dia/mes o mes/dia.

    Nota: he puesto cast as date, pero es idéntico resultado con cast as datetime.

    Puedes probar antes de la sentencia de lectura Set DateFormat dmy en función de si las fechas leídas son día y mes.

    Además depende de la versión de Sql tienes la función try_Cast o try_Convert para poder intentar traducirlo a datetime. Si el valor es correcto, te devuelve un datetime, pero sino, te devuelve un null.

    Datetime ¿Cómo funciona?

    https://javifer2.wordpress.com/2020/09/02/datetime-como-funciona/

    Try_Cast

    https://docs.microsoft.com/es-es/sql/t-sql/functions/try-cast-transact-sql?view=sql-server-ver15


    jueves, 1 de julio de 2021 6:55
  • Hola AlejandroRicotti:

    Quizá tienes que detallar mucho mejor el problema, porque a lo mejor las conclusiones son algo equivocadas.

    declare @fecha nvarchar(max)=N'9/2/2021'
    
    SELECT cast(@fecha as date)

    Se me ocurre, que si la fecha expuesta es otra que no esa, no encaje, que sea por problemas de dia/mes o mes/dia.

    Nota: he puesto cast as date, pero es idéntico resultado con cast as datetime.

    Puedes probar antes de la sentencia de lectura Set DateFormat dmy en función de si las fechas leídas son día y mes.

    Además depende de la versión de Sql tienes la función try_Cast o try_Convert para poder intentar traducirlo a datetime. Si el valor es correcto, te devuelve un datetime, pero sino, te devuelve un null.

    Datetime ¿Cómo funciona?

    https://javifer2.wordpress.com/2020/09/02/datetime-como-funciona/

    Try_Cast

    https://docs.microsoft.com/es-es/sql/t-sql/functions/try-cast-transact-sql?view=sql-server-ver15


    Perdon, ahi estuve haciendo mas pruebas, para ese caso si funciona, pero para este por ejemplo me tira error

    21-1-2021

    Tal vez es porque es dia-mes-ayo y no mes-dia-año



    Aunque el error que me aparece en mi query es


    Cuando quiero hacer el insert, aunque debe ser por lo mismo




    jueves, 1 de julio de 2021 13:47
  • Ojo que estás mezclando separadores.

    9/2/2021

    21-1-2021

    ¿cuál es? o son los dos.  

    Y ¿cuál es el formato ddmmyyyy o mmddyyyy. Según la pregunta era día mes año y la última fecha expuesta no encaja en ese formato.

    jueves, 1 de julio de 2021 14:20
  • Ojo que estás mezclando separadores.

    9/2/2021

    21-1-2021

    ¿cuál es? o son los dos.  

    Y ¿cuál es el formato ddmmyyyy o mmddyyyy. Según la pregunta era día mes año y la última fecha expuesta no encaja en ese formato.

    Tienes razon, perdon, los separadores que vienen en la tabla son /, en el ultimo puse un - porque use un replace para ver si el problema venia por ese lado

    Si, la ultima fecha que expuse es dia mes y año 21/1/2021
    Adjunto una imagen de los valores de la tabla



    Aca va el ejemplo del problema


    El problema es porque en el casteo asume que el 21 es mes, no dia, entonces lo toma como error

    Calculo yo que esto pueda deberse a que cuando subieron el archivo usarian una configuracion regional en español donde la fecha que usamos es dia mes año, y yo estoy usando una en ingles, que es mes dia y año, pero no se como solucionar este problema desde la query

    Muchas gracias

    Saludos

    jueves, 1 de julio de 2021 15:28
  • Hola AlejandroRicotti:

    El escenario:

    CREATE TABLE dbo.valoresDateTime (fecha nvarchar(100))
    Go
    Insert into dbo.valoresDateTime (fecha)
    values
    ('8/1/2021'),
    ('12/1/2021'),
    ('14/1/2021'),
    ('16/1/2021'),
    ('19/1/2021'),
    ('21/1/2021');
    GO

    Como te había mencionado, para esto Sql tiene

    Set dateFormat

    , de manera que se puede establecer para la consulta, cual es el formato.

    Set dateformat dmy;
    select cast(fecha as date) -- o cast(fecha as datetime)
    from dbo.valoresDateTime;


    Aunque mucho más interesante es el uso de try_cast.

    Insert into dbo.valoresDateTime (fecha)
    values
    ('castaña')

    Ahora tenemos una fila que nos estropea la consulta. 

    Set dateformat dmy;
    select Try_cast(fecha as datetime)
    from dbo.valoresDateTime;


    Además con try_cast podemos ver que el uso de set dateFormat es el esperado, ya que si pongo mdy

    Set dateformat mdy;
    select Try_cast(fecha as datetime)
    from dbo.valoresDateTime;

    Los valores devueltos son:

    Por supuesto existe también try_convert por si le queremos dar un formato a la fecha.

    try_cast

    https://docs.microsoft.com/es-es/sql/t-sql/functions/try-cast-transact-sql?view=sql-server-ver15

    Set dateformat

    https://docs.microsoft.com/es-es/sql/t-sql/statements/set-dateformat-transact-sql?view=sql-server-ver15

    viernes, 2 de julio de 2021 1:42