La conversión falló al convertir la fecha y / o la hora de la cadena de caracteres al insertar fecha y hora


164

Estaba tratando de crear una tabla de la siguiente manera,

create table table1(date1 datetime,date2 datetime);

Primero intenté insertar valores como a continuación,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

Ha dado un error diciendo:

No se puede convertir varchar a datetime

Luego probé el siguiente formato como una de las publicaciones sugeridas por nuestro stackoverflow,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

Pero sigo recibiendo el error que dice:

La conversión falló al convertir la fecha y / o la hora de la cadena de caracteres

¿Alguna sugerencia?


2
@Damien_The_Unbeliever como dijiste, ya he referido esta publicación stackoverflow.com/questions/12957635/... antes de hacer esta pregunta. Nos pidieron que usemos 'insertar valores de tabla1 (fecha de aprobación) (convert (datetime, '18 -06-12 10:34:09 PM', 5)); ' pero no funciona
Mari

Respuestas:


163

SQL Server admite muchos formatos: consulte los libros en línea de MSDN sobre CAST y CONVERT . La mayoría de esos formatos dependen de la configuración que tenga, por lo tanto, esta configuración puede funcionar algunas veces, y otras no.

La forma de resolver esto es usar el formato de fecha ISO-8601 (ligeramente adaptado) que es compatible con SQL Server; este formato funciona siempre , independientemente de la configuración de formato de fecha y lenguaje de SQL Server.

El formato ISO-8601 es compatible con SQL Server y viene en dos tipos:

  • YYYYMMDDsolo para fechas (sin porción de tiempo); nota aquí: sin guiones! , eso es muy importante! YYYY-MM-DD¡ NO es independiente de la configuración de formato de fecha en su SQL Server y NO funcionará en todas las situaciones!

o:

  • YYYY-MM-DDTHH:MM:SSpara fechas y horas - tenga en cuenta aquí: este formato tiene guiones (pero se pueden omitir), y se fija Tcomo delimitador entre la porción de fecha y hora de su DATETIME.

Esto es válido para SQL Server 2000 y versiones posteriores.

Entonces, en su caso concreto, use estas cadenas:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

y debe estar bien (nota: debe usar el formato internacional de 24 horas en lugar del formato AM / PM de 12 horas para esto).

Alternativamente : si está usando SQL Server 2008 o más reciente, también podría usar el DATETIME2tipo de datos (en lugar de simple DATETIME) y su actual INSERTsimplemente funcionaría sin ningún problema. :-) DATETIME2es mucho mejor y mucho menos exigente con las conversiones, y de todos modos son los tipos de datos de fecha / hora recomendados para SQL Server 2008 o más nuevos.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

No me preguntes por qué todo este tema es tan complicado y algo confuso, así es como es. Pero con el YYYYMMDDformato, debería estar bien para cualquier versión de SQL Server y para cualquier configuración de idioma y formato de fecha en su SQL Server.


1
Solo como una nota, la transmisión como DATETIME2 también funciona con 'AAAA-MM-DDTHH: MM: SSZ' (nota 'Z' - Hora Zulu al final para indicar la marca de tiempo UTC). Tengo este error al intentar insertar '2013-12-16T17: 21: 26Z' en el campo de fecha y hora. Solo para aclarar, ISO 8601 es compatible parcialmente. No es compatible con el tiempo Zulu, a pesar de que se menciona en la documentación. Probablemente sea una configuración que no he tenido tiempo de resolver, pero en caso de que alguien tenga el mismo problema, tenlo en cuenta.
Michał

3
Puedo confirmar que el formato de fecha 'AAAAMMDD' funciona bien, lo probé en SQL Server 2014, como una forma de especificar una fecha literal en una cláusula WHERE. Many tanks to @marc_s
Giorgio Barchiesi

1
La cosa DATETIME2 funcionó para mí. En mi caso, estaba importando un script de base de datos de un SQLServer en inglés a una versión en español, por lo que siempre aparece el mismo error. Simplemente reemplacé en el script todas las ocurrencias "como DATETIME" a "como DATETIME2" y resolví el problema.
Alejandro del Río

24

La conversión en el servidor SQL falla a veces no debido a los formatos de fecha u hora utilizados, es simplemente porque está tratando de almacenar datos incorrectos que no son aceptables para el sistema.

Ejemplo:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

El servidor SQL arrojará el siguiente error:

Conversion failed when converting date and/or time from character string.

La razón de este error es simplemente que no existe dicha fecha (29 de febrero) en el año (2015).


2
"La razón de este error es simplemente que no existe dicha fecha (29 de febrero) en el año (2015)" Esta fue exactamente la razón por la que recibí este error. Esta respuesta tiene en cuenta la causa más común de este error, que las otras respuestas no.
FirstFraktal

1
Importé datos de una hoja de Excel donde los valores nulos en realidad tenían "NULL" en la celda. Esto se estableció como una cadena "Null" en la tabla DB, por lo que estaba tratando de convertir la cadena "Null" a una fecha y hora. Debería haber vaciado las celdas "NULL" en Excel. Soy un idiota: /
karol

17

Respuesta simple: 5 es italiano "aa" y 105 es italiano "aaaa". Por lo tanto:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

funcionará correctamente, pero

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

Dará error.

Igualmente,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

dará error, donde como

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

trabajará.


8

Simplemente actualice el formato de fecha como abajo

yyyy-MM-dd hh:MM:ss

Me resuelve el problema y funciona bien


2
Por favor, lea las otras respuestas ya proporcionadas. Este formato funciona solo para usted debido a la DATEFORMATconfiguración de su sesión . Verifique esto ejecutando SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);. Funcionará de manera confiable si agrega un Tseparador ( yyyy-MM-ddTHH:mm:ss).
Dan Guzman

1
Muchas gracias, sí, tienes razón, resuelve mi problema y leí las otras respuestas dadas aquí
Pronab Roy

8

Siempre que sea posible, se deben evitar los literales de fecha / hora específicos de la cultura .

Hay algunos formatos seguros para proporcionar una fecha / hora como literal:

Todos los ejemplos para 2016-09-15 17:30:00

ODBC (mi favorito, ya que se maneja como el tipo real de inmediato)

  • {ts'2016-09-15 17:30:00'} - Sello de tiempo
  • {d'2016-09-15'} - Solo fecha
  • {t'17:30:00'} --Tiempo solo

ISO8601 (el mejor para todas partes )

  • '2016-09-15T17:30:00'--¡Ten cuidado con lo que hay Ten el medio!

Sin separar (pequeño riesgo de malinterpretarse como número)

  • '20160915' --solo para cita pura

Es bueno tener en cuenta: las fechas inválidas tienden a aparecer con errores extraños

  • No hay 31 de junio o 30 de febrero ...

Una razón más para los extraños errores de conversión: ¡Orden de ejecución!

SQL-Server sabe hacer cosas en un orden de ejecución que uno no podría haber esperado. Su declaración escrita parece que la conversión se realiza antes de que tenga lugar alguna acción relacionada con el tipo, pero el motor decide, por qué, hacer la conversión en un paso posterior.

Aquí hay un gran artículo que explica esto con ejemplos: Rusano.com: "t-sql-functions-do-no-implica-un-cierto-orden-de-ejecución" y aquí está la pregunta relacionada .


3

la mejor manera es este código

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
Si usa backticks, en lugar de espacios iniciales, obtendrá el ajuste de palabras.
Jesse W en Z - Abandonado el SE

2

El formato de fecha y hora que realmente se ejecuta en el servidor SQL es

yyyy-mm-dd hh:MM:ss

1
No, esto no es cierto (además de la falta de coincidencia de my M). Lea el comentario de Dan Guzman a la respuesta de Pronab Roy. Y lea las otras respuestas aquí ...
Shnugo

2

Por favor intente esto.

SQL Server espera fechas en formato MM / DD / AAAA, si el inglés está configurado como su idioma predeterminado. Aquí estoy guardando el valor de selector de fecha en la base de datos sql2008. Mi tipo de campo es fecha y hora en la base de datos.dpdob es mi nombre de selector de fecha.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Ahora use dob en su consulta de inserción.


1

Puedes probar este código

select (Convert(Date, '2018-04-01'))

1

Tuve este problema al intentar concatenar getdate()en una cadena que estaba insertando en un campo nvarchar.

Hice un casting para evitarlo:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

Ese es un ejemplo desinfectado. La parte clave de eso es:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

Lanzó la fecha como datetime2, luego nvarcharpara concatenarla.


1

Estoy intentando esto y está trabajando conmigo:

SELECT CONVERT(date, yourDate ,104)

0

establecer Cultura en inglés desde el archivo web.config

  <globalization uiCulture="en-US" culture="en-US" />

por ejemplo, si configuras la cultura en árabe, el tiempo será

22/09/2017 02:16:57 ص

y obtiene el error: la conversión falló al convertir la fecha y / o la hora de la cadena de caracteres al insertar datetime



0

Para mí esto funcionó:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.