Error de conversión al convertir la fecha y/o la hora de una cadena de caracteres al insertar la fecha y hora
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?
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:
YYYYMMDD
solo 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:ss
para fechas y horas: tenga en cuenta que este formato tiene guiones (pero se pueden omitir) y unT
delimitador fijo entre la parte de fecha y hora de su archivoDATETIME
.
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 DATETIME2
tipo de datos (en lugar de simple DATETIME
) y su versión actual INSERT
funcionará sin ningún problema. :-) DATETIME2
es 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 YYYYMMDD
formato, 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.
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).
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á.
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 conT
el 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 .
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