sql >> Base de Datos >  >> RDS >> Sqlserver

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

SQL Server admite muchos formatos:consulte los libros en línea de MSDN sobre CAST y CONVERT. La mayoría de esos formatos son dependientes en qué configuraciones tiene, por lo tanto, estas configuraciones pueden funcionar algunas veces, y otras veces no.

La forma de solucionar esto es usar el (ligeramente adaptado) formato de fecha ISO-8601 que es compatible con SQL Server:este formato funciona siempre - independientemente de la configuración de formato de fecha e idioma de SQL Server.

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

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

o:

  • YYYY-MM-DDTHH:MM:SS para fechas y horas - nota aquí:este formato tiene guiones (pero pueden omitirse) y una T fija como delimitador entre la parte de fecha y hora de su 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 servicio internacional de 24 horas en lugar del formato de 12 horas AM/PM para esto).

Alternativamente :si está en SQL Server 2008 o más reciente, también puede usar el DATETIME2 tipo de datos (en lugar de simple DATETIME ) y su INSERT actual simplemente funcionaría 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 preguntes por qué todo este tema es tan complicado y algo confuso, así es como es. 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.