Error de conversión al convertir la fecha y/o la hora de una cadena de caracteres al insertar la fecha y hora

Resuelto Mariappan Subramanian asked hace 12 años • 20 respuestas

Estaba intentando crear una tabla de la siguiente manera,

create table table1(date1 datetime,date2 datetime);

Primero intenté insertar valores como se muestra a continuación,

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

Ha dado error diciendo,

No se puede convertir varchar a fecha y hora

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:

Error de conversión al convertir la fecha y/u hora de una cadena de caracteres

¿Alguna sugerencia?

Mariappan Subramanian avatar Jan 02 '13 15:01 Mariappan Subramanian
Aceptado

Hay muchos formatos admitidos por SQL Server; 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, estas configuraciones pueden funcionar algunas veces y otras no.

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

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

  • YYYYMMDDsolo para fechas (sin porción de tiempo); tenga en cuenta aquí: ¡ sin guiones! ¡Eso es muy importante! ¡NOYYYY-MM-DD es independiente de la configuración del 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 que este formato tiene guiones (pero se pueden omitir) y un Tdelimitador fijo entre la parte de fecha y hora de su archivo DATETIME.

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

Entonces, en su caso específico, use estas cadenas:

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

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

Alternativamente : si tiene SQL Server 2008 o una versión posterior, también puede usar el DATETIME2tipo de datos (en lugar de simple DATETIME) y su versión actual INSERTfuncionará sin ningún problema. :-) DATETIME2es mucho mejor y mucho menos exigente con las conversiones, y de todos modos es el tipo de datos de fecha/hora recomendado para SQL Server 2008 o posterior.

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 pregunten por qué todo este tema es tan complicado y algo confuso; así son las cosas. 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.

marc_s avatar Jan 02 '2013 08:01 marc_s

A veces, la conversión en SQL Server falla no debido a los formatos de fecha u hora utilizados. Es simplemente porque está intentando 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:

La conversión falló al convertir la fecha y/u hora de una cadena de caracteres.

El motivo de este error es simplemente que no existe dicha fecha (29 de febrero) en el año (2015).

Ashraf Sada avatar Jun 06 '2015 20:06 Ashraf Sada

Respuesta simple: 5 es "yy" italiano y 105 es "yyyy" italiano. 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.

Asimismo,

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á.

Raj avatar Jan 02 '2013 09:01 Raj

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

Existen algunos formatos seguros para proporcionar una fecha/hora literal:

Todos los ejemplos para2016-09-15 17:30:00

ODBC (mi favorito, ya que se trata como el tipo real inmediatamente)

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

ISO8601 (lo mejor para todas partes )

  • '2016-09-15T17:30:00'--¡Ten cuidado con Tel medio!

No separados (pequeño riesgo de ser malinterpretado como un número)

  • '20160915' --solo para cita pura

Es bueno tenerlo en cuenta: las fechas no válidas tienden a aparecer con errores extraños

  • No existe el 31 de junio ni el 30 de febrero...

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

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

Aquí hay un excelente artículo que explica esto con ejemplos: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" y aquí está la pregunta relacionada .

Shnugo avatar Sep 15 '2016 06:09 Shnugo

Simplemente actualice el formato de fecha como se muestra a continuación

yyyy-MM-dd hh:MM:ss

A mi me soluciona el problema y funciona bien

Pronab Roy avatar Aug 19 '2017 09:08 Pronab Roy