2010-09-15 5 views
6

Tengo que llegar el mes de una columna que almacena la cadena en formato -¿Cómo obtener el mes de una cadena en sql?

Column 
---------- 
`Feb2007'  
'Sep2008' 

lo tanto, si el valor era 'Feb2007' entonces necesito para volver 2 o de lo contrario, si el valor era 'Sep2009' entonces debería volver 9 .

¿Hay una función incorporada en SQL Server 2008 para lograr algo como esto?

+0

Los valores se almacenan en una lista separada por comas? –

+0

No, solo se almacena como una entrada. Quiero decir que una fila tiene valor Feb2007 y luego la segunda fila tiene valor Sep2008 – Vishal

+2

¡Espero que no estés almacenando las comillas ''' en la columna también! Varchar fechas son lo suficientemente malo! –

Respuesta

9

Prueba esto:

select datepart(mm, cast('feb2008' as datetime)) 
+1

+1: Funciona para mí en 2005 –

+0

Supongo que realmente depende de la configuración regional. Apuesto a que es posible que el servidor sql no reconozca esta cadena como fecha. –

+1

Siempre tiemblo cuando alguien almacena una fecha/hora como VARCHAR/etc en lugar del tipo de datos de FECHA/HORA nativa ... –

1

Por lo menos, se puede crear una tabla con los nombres de los meses y los valores numéricos.

Si la función de servidor siempre reconoce los nombres de sus meses correctamente, está bien, pero si alguno de esos datos se ingresó manualmente, podría haber errores ortográficos u otras incoherencias, y una tabla le permitiría respaldarlos.

3

también esto:

MES SELECT (CAST (date_col AS fecha y hora))

+0

+1: Probado, funcionó bien en 2005 –

+2

O simplemente 'seleccione mes ('sep2008')' –

0

Me totalmente de acuerdo con Beth aquí - pero con justificaciones de por qué se debe hacer en lugar de como un último recurso:

Los datos deben almacenarse en su formato original. Ya no deberías almacenarlo como una cadena de lo que deberías con un entero de 8 bits. Tiene tanto/poco sentido. SQL es una bestia muy inteligente, pero si arruinas tus tipos de datos fundamentales la mayor parte de su funcionalidad útil y la heurística salen de la ventana, incluso cosas básicas como indexando y ordenando. Sin mencionar que sus datos se convierten en SQL Server explícitos (es decir, se basan en cierto comportamiento de SQL) en lugar de genéricos, lo que reduce la portabilidad.

Para ponerlo en términos más formales: lo está forzando a convertirse en información en la capa de datos. Esto es la antítesis de todas las reglas conocidas de manejo de datos.

0
SELECT month(column); 

Esto debería funcionar, ha pasado un tiempo desde que utilicé SQL Server.

0
datepart(month,_datetime) 

donde _datetime es la columna. también se puede utilizar

datepart(month,getdate()) 

para obtener el mes en curso

0

posible que tenga que volver a su diseño de base de datos, si es posible. Mucho más eficiente para convertirlo a fecha y hora antes de almacenarlo en la tabla. Por ejemplo, encontrar un rango de fechas tomará mucho más tiempo de lo que necesita porque tendría que emitir cada valor distinto antes de encontrar las fechas en su rango.

Cuestiones relacionadas