Estaba intentando crear una tabla como la siguiente,
create table table1(date1 datetime,date2 datetime);
Primero intenté insertar los valores como se indica 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 datetime
Entonces intenté el siguiente formato como uno de los post sugeridos 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 todavía estoy recibiendo el error diciendo,
Fallo en la conversión de la fecha y/o la hora a partir de una cadena de caracteres*.
¿Alguna sugerencia?
Hay muchos formatos soportados por SQL Server - ver los Libros de MSDN en línea sobre CAST y CONVERT. La mayoría de esos formatos son dependientes de la configuración que tengas - por lo tanto, estas configuraciones pueden funcionar algunas veces - y otras no.
La forma de resolver esto es utilizar el formato de fecha (ligeramente adaptado) ISO-8601 que es soportado por SQL Server - este formato funciona siempre - independientemente de su lenguaje y configuración de formato de fecha de SQL Server.
El formato ISO-8601 es soportado por SQL Server viene en dos sabores:
AAAAMMDD
para las fechas (sin la parte de la hora); tenga en cuenta aquí: ¡sin guiones!, ¡eso es muy importante! El formato "AAAA-MM-DD" no es independiente de la configuración del formato de fecha en su SQL Server y no funcionará en todas las situaciones.o:
AAAA-MM-DDTHH:MM:SS
para fechas y horas - nota aquí: este formato tiene guiones (pero pueden ser omitidos), y una T
fija como delimitador entre la porción de fecha y hora de su DATETIME
.Esto es válido para SQL Server 2000 y posteriores.
Así que en tu caso concreto - utiliza estas cadenas:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
y deberías estar bien (nota: necesitas usar el formato internacional de 24 horas en lugar del formato de 12 horas AM/PM para esto).
Alternativamente: si estás en SQL Server 2008 o más reciente, también podrías usar el tipo de dato DATETIME2
(en lugar de DATETIME
) y tu actual INSERT
funcionaría sin problemas. :-) El tipo de datos DATETIME2
es mucho mejor y mucho menos exigente con las conversiones - y es el tipo de datos de fecha/hora recomendado para SQL Server 2008 o más reciente.
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 - eso es sólo la forma en que es. Pero con el formato YYYMMDD
, deberías estar bien para cualquier versión de SQL Server y para cualquier idioma y configuración de formato de fecha en tu SQL Server.
La conversión en SQL server falla a veces no por los formatos de fecha u hora utilizados, es simplemente porque se está tratando de almacenar datos erróneos que no son aceptables para el sistema.
Ejemplo:
Crear Tabla MiTabla (MiFecha);
Insertar en MiTabla(MiFecha) valores ('2015-02-29');
El servidor SQL arrojará el siguiente error:
Conversión fallida al convertir la fecha y/o la hora desde una cadena de caracteres.
La razón de este error es simplemente que no hay tal fecha (Feb-29) en el año (2015).
Respuesta sencilla: 5 es italiano "yy" y 105 es italiano "yyyy". 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, mientras que
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
funcionará.