Published on

July 11, 2013

Ordenar y Mostrar Nombres de Meses en SQL Server

Introducción:

Cuando se trabaja con fechas en SQL Server, es común almacenarlas como el tipo de dato DATETIME. Sin embargo, mostrar el nombre del mes como un nombre completo y ordenar los datos correctamente puede ser un desafío. Si bien la interfaz gráfica puede manejar esta tarea en algunos casos, hay situaciones en las que no es posible. En este artículo, exploraremos algunos conceptos y técnicas de SQL Server para resolver estos problemas comunes.

Datos de Prueba:

Antes de sumergirnos en las soluciones, creemos algunos datos de prueba para trabajar. El siguiente fragmento de código genera una tabla con fechas y cantidades aleatorias para un período de 20 años a partir de 2005.


-- Crear los datos de prueba.
IF OBJECT_ID('tempdb..#MyHead','U') IS NOT NULL
    DROP TABLE #MyHead;

-- Crear la tabla y poblarla sobre la marcha.
SELECT TOP (1000000)
    SomeDateTime = RAND(CHECKSUM(NEWID()))*7305 + CAST('2005' AS DATETIME),
    SomeAmount   = CAST(RAND(CHECKSUM(NEWID()))*100 AS MONEY)
INTO #MyHead
FROM master.sys.all_columns ac1
CROSS JOIN master.sys.all_columns ac2;

-- Agregar un índice agrupado a la tabla.
CREATE CLUSTERED INDEX IX_#MyHead_SomeDateTime
ON #MyHead (SomeDateTime);

Mostrar Nombres de Meses:

Ordenar los tipos de datos DATETIME es sencillo: simplemente use una cláusula ORDER BY en la columna DATETIME. Sin embargo, cuando se trata de mostrar solo el nombre del mes, muchas personas recurren a crear funciones escalares con múltiples declaraciones CASE. Afortunadamente, SQL Server proporciona una función incorporada llamada DATENAME que devuelve el nombre completo del mes según la configuración de idioma actual. Veamos un ejemplo de cómo usarlo para mostrar totales para cada mes en el año 2010:


-- Sumar los datos para cada mes y ordenar los nombres de los meses correctamente.
SELECT [Mes] = DATENAME(mm, SomeDateTime),
       Cantidad  = SUM(SomeAmount)
FROM #MyHead
WHERE SomeDateTime >= '2010' AND SomeDateTime < '2011'
GROUP BY DATENAME(mm, SomeDateTime);

Ordenar los Nombres de los Meses:

Ordenar los nombres de los meses puede ser un poco más complicado. Un enfoque es utilizar CTEs o UDFs, pero el código puede volverse largo y complejo. Sin embargo, hay una solución más simple disponible. Al agregar una conversión y una constante a la cláusula ORDER BY, podemos convertir el nombre del mes nuevamente a una fecha ordenable. Dado que el año no importa para fines de ordenación, podemos usar cualquier año, como 1900. Aquí tienes un ejemplo:


-- Sumar los datos para cada mes y ordenar los nombres de los meses correctamente.
SELECT [Mes] = DATENAME(mm, SomeDateTime),
       Cantidad  = SUM(SomeAmount)
FROM #MyHead
WHERE SomeDateTime >= '2010' AND SomeDateTime < '2011'
GROUP BY DATENAME(mm, SomeDateTime)
ORDER BY CAST(DATENAME(mm, SomeDateTime) + ' 1900' AS DATETIME);

Conclusión:

Ordenar y mostrar nombres de meses en SQL Server puede ser desafiante, pero con las técnicas adecuadas, se puede lograr de manera eficiente. Al aprovechar la función DATENAME y agregar una conversión en la cláusula ORDER BY, podemos obtener los resultados deseados. Esperemos que este artículo te haya proporcionado algunos conceptos útiles de SQL Server para abordar problemas similares en tus propios proyectos.

¡Gracias por leer!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.