example ejemplo sql sql-server sql-server-2005 tsql string-to-datetime

ejemplo - insert date sql



Conversión de secuencia de servidor Sql a fecha (10)

Quiero convertir una cadena como esta:

''10/15/2008 10:06:32 PM''

en el valor DATETIME equivalente en el servidor Sql.

En Oracle, diría esto:

TO_DATE(''10/15/2008 10:06:32 PM'',''MM/DD/YYYY HH:MI:SS AM'')

Esta pregunta implica que debo analizar la cadena en uno de los formatos estándar y luego convertir utilizando uno de esos códigos. Eso parece ridículo para una operación tan mundana. hay una manera mas facil?


Ejecuta esto a través de tu procesador de consultas. Da formato a las fechas y / o horarios de ese modo y una de ellas debería darle lo que está buscando. No será difícil adaptarse:

Declare @d datetime select @d = getdate() select @d as OriginalDate, convert(varchar,@d,100) as ConvertedDate, 100 as FormatValue, ''mon dd yyyy hh:miAM (or PM)'' as OutputFormat union all select @d,convert(varchar,@d,101),101,''mm/dd/yy'' union all select @d,convert(varchar,@d,102),102,''yy.mm.dd'' union all select @d,convert(varchar,@d,103),103,''dd/mm/yy'' union all select @d,convert(varchar,@d,104),104,''dd.mm.yy'' union all select @d,convert(varchar,@d,105),105,''dd-mm-yy'' union all select @d,convert(varchar,@d,106),106,''dd mon yy'' union all select @d,convert(varchar,@d,107),107,''Mon dd, yy'' union all select @d,convert(varchar,@d,108),108,''hh:mm:ss'' union all select @d,convert(varchar,@d,109),109,''mon dd yyyy hh:mi:ss:mmmAM (or PM)'' union all select @d,convert(varchar,@d,110),110,''mm-dd-yy'' union all select @d,convert(varchar,@d,111),111,''yy/mm/dd'' union all select @d,convert(varchar,@d,12),12,''yymmdd'' union all select @d,convert(varchar,@d,112),112,''yyyymmdd'' union all select @d,convert(varchar,@d,113),113,''dd mon yyyy hh:mm:ss:mmm(24h)'' union all select @d,convert(varchar,@d,114),114,''hh:mi:ss:mmm(24h)'' union all select @d,convert(varchar,@d,120),120,''yyyy-mm-dd hh:mi:ss(24h)'' union all select @d,convert(varchar,@d,121),121,''yyyy-mm-dd hh:mi:ss.mmm(24h)'' union all select @d,convert(varchar,@d,126),126,''yyyy-mm-dd Thh:mm:ss:mmm(no spaces)''


En SQL Server Denali, podrás hacer algo que se aproxime a lo que estás buscando. Pero aún no puede pasar cualquier cadena de fecha extravagante definida arbitrariamente y esperar que SQL Server se acomode. Aquí hay un ejemplo que usa algo que publicó en su propia respuesta. La función FORMAT () y también puede aceptar configuraciones regionales como un argumento opcional: se basa en el formato de .Net, por lo que la mayoría, si no todos los formatos de tokens que esperaría ver, estarán allí.

DECLARE @d DATETIME = ''2008-10-13 18:45:19''; -- returns Oct-13/2008 18:45:19: SELECT FORMAT(@d, N''MMM-dd/yyyy HH:mm:ss''); -- returns NULL if the conversion fails: SELECT TRY_PARSE(FORMAT(@d, N''MMM-dd/yyyy HH:mm:ss'') AS DATETIME); -- returns an error if the conversion fails: SELECT PARSE(FORMAT(@d, N''MMM-dd/yyyy HH:mm:ss'') AS DATETIME);

Le recomiendo encarecidamente que tome más control y desinfecte las entradas de su fecha. Los días de permitir que las personas escriban las fechas usando el formato que deseen en un campo de formulario de texto libre deberían estar muy lejos de nosotros ahora. Si alguien ingresa el 8/9/2011, ¿es ese 9 de agosto o 8 de septiembre? Si les haces elegir una fecha en un control de calendario, entonces la aplicación puede controlar el formato. No importa cuánto intente predecir el comportamiento de sus usuarios, ellos siempre encontrarán una manera más tonta de ingresar una fecha que no planeó.

Hasta Denali, sin embargo, creo que @Ovidiu tiene el mejor consejo hasta el momento ... esto puede ser bastante trivial al implementar su propia función CLR. Luego puede escribir una caja / interruptor para tantos formatos extravagantes como quiera.

ACTUALIZACIÓN para @dhergert :

SELECT TRY_PARSE(''10/15/2008 10:06:32 PM'' AS DATETIME USING ''en-us''); SELECT TRY_PARSE(''15/10/2008 10:06:32 PM'' AS DATETIME USING ''en-gb'');

Resultados:

2008-10-15 22:06:32.000 2008-10-15 22:06:32.000

Todavía necesita tener esa otra pieza crucial de información primero. No puede usar T-SQL nativo para determinar si el 6/9/2012 es el 9 de junio o el 6 de septiembre.


Esta page tiene algunas referencias para todas las conversiones de fecha y hora especificadas disponibles para la función CONVERT. Si sus valores no entran en uno de los patrones aceptables, entonces creo que lo mejor es ir a la ruta ParseExact.


Para este problema, la mejor solución que uso es tener una función CLR en Sql Server 2005 que use una de las funciones DateTime.Parse o ParseExact para devolver el valor DateTime con un formato específico.


Personalmente, si se trata de formatos arbitrarios o totalmente fuera de la pared, siempre que sepa con anticipación cuáles van a ser o cuáles van a ser, simplemente use regexp para extraer las secciones de la fecha que desee y forme un componente válido de fecha / fecha y hora.



SQL Server (2005, 2000, 7.0) no tiene ninguna forma flexible, o incluso no flexible, de tomar una fecha y hora estructurada arbitrariamente en formato de cadena y convertirla al tipo de datos de fecha y hora.

Por "arbitrariamente", me refiero a "una forma que la persona que la escribió, aunque tal vez no sea usted, yo o alguien del otro lado del planeta, la considere intuitiva y completamente obvia". Francamente, no estoy seguro de que exista tal algoritmo.


Si desea que SQL Server intente resolverlo, simplemente use CAST CAST (''whatever'' AS datetime). Sin embargo, esa es una mala idea en general. Hay problemas con fechas internacionales que podrían surgir. Entonces, como ha descubierto, para evitar esos problemas, desea utilizar el formato canónico ODBC de la fecha. Ese es el formato número 120, 20 es el formato para solo dos dígitos. No creo que SQL Server tenga una función integrada que le permita proporcionar un formato dado por el usuario. Puede escribir el suyo e incluso puede encontrar uno si realiza una búsqueda en línea.


Utilizar esta:

SELECT convert(datetime, ''2018-10-25 20:44:11.500'', 121) -- yyyy-mm-dd hh:mm:ss.mmm

Y consulte la tabla en la documentación oficial para los códigos de conversión.