Conversión de cadena de Sql Server a fecha


Quiero convertir una cadena como esta:

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

En el valor DATETIME equivalente en Sql Server.

En Oracle, yo 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 usando uno de esos códigos. Eso parece ridículo para una operación tan mundana. Hay una manera más fácil?

Author: Aaron Bertrand, 2008-10-16

10 answers

SQL Server (2005, 2000, 7.0) no tiene ninguna forma flexible, o incluso no flexible, de tomar un datetime arbitrariamente estructurado en formato de cadena y convertirlo al tipo de datos datetime.

Por "arbitrariamente", quiero decir "una forma que la persona que la escribió, aunque quizás no tú o yo o alguien en el otro lado del planeta, consideraría intuitiva y completamente obvia."Francamente, no estoy seguro de que exista tal algoritmo.

 28
Author: Philip Kelley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 20:33:16

Prueba esto

Cast('7/7/2011' as datetime)

Y

Convert(varchar(30),'7/7/2011',102)

Vea CAST and CONVERT (Transact-SQL) para más detalles.

 230
Author: gauravg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-22 16:36:40

Ejecute esto a través de su procesador de consultas. Da formato a las fechas y / o horas como así y una de estas debería darte lo que estás buscando. No será difícil de adaptar:

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)'
 38
Author: Taptronic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-21 23:29:04

En SQL Server Denali, podrás hacer algo que se acerque a lo que estás buscando. Pero aún así no puede pasar cualquier cadena de fecha extravagante definida arbitrariamente y esperar que SQL Server se adapte. Aquí hay un ejemplo usando algo que publicaste en tu 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, de 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);

Yo fuertemente animarle a tomar más control y desinfectar sus entradas de fecha. Los días de dejar que las personas escriban fechas usando el formato que quieran en un campo de formulario de texto libre ya deberían estar muy atrás. Si alguien entra 8/9/2011 es que el 9 de agosto o 8 de septiembre? Si haces que elijan una fecha en un control de calendario, la aplicación puede controlar el formato. No importa cuánto intentes predecir el comportamiento de tus usuarios, siempre descubrirán una forma más tonta de ingresar una fecha que no planeaste para.

Hasta Denali, sin embargo, creo que @Ovidiu tiene el mejor consejo hasta ahora... esto se puede hacer bastante trivial mediante la implementación de su propia función CLR. A continuación, puede escribir un caso/switch para tantos formatos no estándar extravagantes como desee.


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 6/9/2012 es el 9 de junio o septiembre 6th.

 33
Author: Aaron Bertrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-31 19:03:11

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

 10
Author: Ovidiu Pacurar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-16 02:29:47

¿Por qué no probar

select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]

Los formatos de fecha se pueden encontrar en SQL Server Helper > SQL Server Date Formats

 7
Author: Scott Gollaglee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-19 10:02:43

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

 2
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-16 02:53:39

Personalmente si está tratando con formatos arbitrarios o totalmente fuera de la pared, siempre que sepa lo que son antes de tiempo o van a ser, simplemente use regexp para extraer las secciones de la fecha que desea y formar un componente válido de fecha/fecha y hora.

 2
Author: SyWill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-01 15:32:45

Si desea que SQL Server lo intente y lo averigüe, simplemente use CAST CAST ('lo que sea' COMO datetime) Sin embargo, es una mala idea en general. Hay problemas con las fechas internacionales que surgirían. Así que como usted ha encontrado, 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 años. No creo que SQL Server tenga una función incorporada que le permita proporcionar un formato dado por el usuario. Usted puede escribir su propia y incluso podría encontrar uno si busca en línea.

 1
Author: Will Rickards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-16 02:50:26

Usa esto:

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

Y véanse los códigos de conversión en el cuadro de la documentación oficial .

 1
Author: Simone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-29 09:43:54