¿Cómo analizar la cadena en la fecha?


Respuestas:




21

Suponiendo que la base de datos sea MS SQL Server 2012 o superior, aquí hay una solución que funciona. La declaración básica contiene el try-parse en línea:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Esto es lo que implementamos en la versión de producción:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

Las columnas ModifiedOn y ModifiedBy son solo para fines de seguimiento de la base de datos interna.

Consulte también estas referencias de Microsoft MSDN:


Esto supone que el OP está utilizando Sql Server 2012+
Mark Kram

8

Aunque lo de CONVERT funciona, en realidad no deberías usarlo. Debería preguntarse por qué está analizando valores de cadena en SQL-Server. Si este es un trabajo único en el que está arreglando manualmente algunos datos, no obtendrá esos datos en otro momento, está bien, pero si alguna aplicación lo está usando, debe cambiar algo. La mejor forma sería utilizar el tipo de datos "fecha". Si se trata de una entrada del usuario, es aún peor. Entonces, primero debería hacer un chequeo del cliente. Si realmente desea pasar valores de cadena donde SQL-Server espera una fecha, siempre puede usar el formato ISO ('AAAAMMDD') y debería convertir automáticamente.


5
¿Qué pasa con una situación en la que está importando archivos de datos desde algún sistema externo, y la columna de entrada está en uno de estos formatos, por ejemplo, "31/05/2013", pero que viene como una cadena? ¿Y está escribiendo, digamos, un procedimiento almacenado para importar esos datos, o usando SSIS para importarlos? Entonces CONVERT sería lo apropiado para usar, ¿no es así?
David Barrows

No necesariamente, en las situaciones en las que MS SQL Server aloja modelos de datos analíticos, a diferencia de los de transacciones, está perfectamente bien usar CONVERT porque tiene que lidiar con muchas fuentes externas que no vendrían fácilmente como un tipo de fecha. (como David Barrows aludió anteriormente).
Será el

El formato de literal de cadena predeterminado para las fechas es AAAA-MM-DD
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

hará lo que sea necesario, resultado:

2012-04-24 00:00:00.000

Eso no parece funcionar para lo que publicó el OP, incluso para diferentes configuraciones de idioma. Intentalo. Si realmente funciona para usted, publique cuál es su configuración de idioma actual. Gracias. Aquí está el código para probar ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
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.