¿Cómo analizar la cadena en la fecha?

85

¿Cómo puedo convertir una cadena en una fecha en T-SQL?

Mi caso de prueba es la cadena: '24.04.2012'

Nazar Tereshkovych
fuente

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:

MAbraham1
fuente
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.

Eric
fuente
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
4

Puedes usar:

SELECT CONVERT(datetime, '24.04.2012', 103) AS Date

Referencia: CAST y CONVERT (Transact-SQL)

Seann Alexander
fuente
Es interesante que funcione. El formato 103 es dd / mm / aaaa y el 104 es dd.mm.yyyy.
Jeff Moden
1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

hará lo que sea necesario, resultado:

2012-04-24 00:00:00.000
JMMS Karunarathne
fuente
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