Quiero convertir una cadena como esta:
'10/15/2008 10:06:32 PM'
en el valor DATETIME equivalente en SQL Server.
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 usando uno de esos códigos. Eso parece ridículo para una operación tan mundana. hay una manera mas facil?
sql-server
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
fuente
fuente
Respuestas:
SQL Server (2005, 2000, 7.0) no tiene ninguna forma flexible, o incluso no flexible, de tomar una fecha y hora arbitrariamente estructurada 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 usted o yo o alguien del otro lado del planeta, consideraría intuitiva y completamente obvia". Francamente, no estoy seguro de que exista tal algoritmo.
fuente
9/6/12
significaba el 6 de septiembre de 2012, el 9 de junio de 2012, el 6 de diciembre de 2009, o algo más?Prueba esto
y
Ver CAST y CONVERT (Transact-SQL) para más detalles.
fuente
Cast('2011-07-07' as datetime)
también funciona y elimina la ambigüedad sobre el orden de mes y día.SET DATEFORMAT dmy
antes de su consultaEjecute esto a través de su procesador de consultas. Formatea fechas y / o horarios de esta manera y uno de estos debería darle lo que está buscando. No será difícil adaptarse:
fuente
En SQL Server Denali, podrá hacer algo que se acerque a lo que está buscando. Pero aún no puede pasar ninguna cadena de fecha loca arbitrariamente definida 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 argumento opcional: se basa en el formato de .Net, por lo que la mayoría, si no todos, los formatos de token que esperaría ver estarán allí.
Le recomiendo encarecidamente que tome más control y desinfecte sus entradas de fecha. Los días de permitir que las personas escriban fechas usando el formato que quieran en un campo de formulario de texto libre ya deberían estar atrás. Si alguien ingresa el 8/9/2011, ¿es ese el 9 de agosto o el 8 de septiembre? Si los hace elegir una fecha en un control de calendario, la aplicación puede controlar el formato. No importa cuánto intente predecir el comportamiento de sus usuarios, siempre encontrarán una manera más tonta de ingresar una fecha que no planeó.
Sin embargo, hasta Denali, creo que @Ovidiu tiene el mejor consejo hasta ahora ... esto puede hacerse bastante trivial implementando su propia función CLR. Luego puede escribir un caso / interruptor para tantos formatos extraños no estándar como desee.
ACTUALIZACIÓN para @dhergert :
Resultados:
Todavía necesita tener esa otra información crucial primero. No puede usar T-SQL nativo para determinar si
6/9/2012
es el 9 de junio o el 6 de septiembre.fuente
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 especificado.
fuente
Utilizar este:
Y consulte la tabla en la documentación oficial para los códigos de conversión.
fuente
porque no intentarlo
los formatos de fecha se pueden encontrar en Ayudante de SQL Server> Formatos de fecha de SQL Server
fuente
select convert(date,'10/15/2011 00:00:00',101)
. Más detalles sobre el formato y por qué 101, en docs.microsoft.com/en-us/sql/t-sql/functions/…Me tomó un minuto resolver esto, así que aquí está en caso de que pueda ayudar a alguien:
En SQL Server 2012 y superior, puede usar esta función:
Así es como terminé extrayendo las partes de la fecha para ponerlas en esta función:
fuente
Esta página tiene algunas referencias para todas las conversiones de fecha y hora disponibles para la función CONVERTIR. Si sus valores no caen dentro de uno de los patrones aceptables, entonces creo que lo mejor es seguir la ruta ParseExact.
fuente
Personalmente, si está tratando con formatos arbitrarios o totalmente fuera de la pared, siempre que sepa cuáles son antes de lo que serán, simplemente use regexp para extraer las secciones de la fecha que desee y formar un componente válido de fecha / fecha y hora.
fuente
Sé que esta es una publicación antigua malvada con muchas respuestas, pero muchas personas piensan que NECESITAN separar las cosas y volver a armarlas o insisten en que no hay forma de hacer implícitamente la conversión que solicitó el original de OP. .
Para revisar y, con suerte, proporcionar una respuesta fácil a otros con la misma pregunta, el OP preguntó cómo convertir '10 / 15/2008 10:06:32 PM 'a un DATETIME. Ahora, SQL Server tiene algunas dependencias de idioma para las conversiones temporales, pero si el idioma es inglés o algo similar, esto se convierte en un problema simple ... solo haga la conversión y no se preocupe por el formato. Por ejemplo (y puedes usar CONVERT o CAST) ...
... y eso produce las siguientes respuestas, las cuales son correctas.
Como dicen en los comerciales de televisión, "¡Pero espera! ¡No hagas el pedido todavía! ¡Sin costo adicional, puede hacer MUCHO más!"
Veamos el poder real de las conversiones temporales con DATETIME y examinemos parcialmente el error conocido como DATETIME2. Echa un vistazo a los formatos extravagantes que DATETIME puede manejar automáticamente y DATETIME2 no puede. Ejecute el siguiente código y vea ...
Entonces, sí ... SQL Server realmente tiene un método bastante flexible para manejar todo tipo de formatos temporales extraños y no se requiere un manejo especial. Ni siquiera tuvimos que eliminar los "PM" que se agregaron a las 24 horas. Es "PFM" (Pure Freakin 'Magic).
Las cosas variarán un poco dependiendo del IDIOMA que haya seleccionado para su servidor, pero gran parte de esto se manejará de cualquier manera.
Y estas conversiones "auto-mágicas" no son algo nuevo. Recorren un largo camino de regreso.
fuente
Si desea que SQL Server intente resolverlo, simplemente use CAST CAST ('cualquiera' como fecha y hora) Sin embargo, esa es una mala idea en general. Hay problemas con las fechas internacionales que aparecerían. Entonces, como 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 años de solo dos dígitos. No creo que SQL Server tenga una función incorporada que le permita proporcionar un formato dado por el usuario. Puede escribir el suyo e incluso puede encontrar uno si busca en línea.
fuente
convertir cadena a fecha y hora en MSSQL implícitamente
fuente
fuente