Optimizar consultas SQL con filtros por Mes y Año
Вставка
- Опубліковано 8 лют 2025
- Cuando escribimos consultas T-SQL que necesitas obtener todos los datos de un mes y tenemos solo una columna de fecha la opción fácil es recurrir a las funciones MONTH y YEAR. Sin embargo, eso es lo peor que podemos hacer ya que acaba con el rendimiento de nuestra consulta. En el video de hoy me he propuesto demostrártelo además de enseñarte una alternativa mejor.
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
No te pierdas nada, síguenos en todas nuestras redes:
Canal de Telegram: t.me/SQLServer...
Blog: www.soydba.es
Comunidad de Telegram: t.me/SQLServer...
X (Twitter): / soy_dba
Instagram: / soydba
TikTok: / soydba
GitHub: github.com/SoyDBA
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
También puedes ayudarnos usando nuestros enlaces de afiliado de Amazon. Usando este enlace a ti te costarán lo mismo tus compras pero a nosotros nos ayuda a mantener los canales. amzn.to/3TnJxaT
Y si utilizas la función eomonth para el parámetro final y omites el cálculo del último día, cuál sería el rendimiento
Es exactamente lo mismo, siempre que uses la función en el lado del valor del filtro y no en el del campo de la tabla. Se calculará una vez y se usará para comparar con la tabla. No vas a notar la diferencia entre el calculo único de la última fecha de un mes a mano o con EOMONTH siempre que sea eso, solo una vez.
Espectacular, gracias por la explicación, buscaba un canal con estas características
Gracias a ti @Santymarchulo. Si tienes alguna sugerencia o tema del que te gustaría que hable me lo comentas.
Si agrupas por los meses de un año se debería hacer un bucle si se quiere usar la opción que comentas, ¿no? muy interesante el video. Un saludo.
Siempre que se pueda debemos evitar los bucles. Para el caso que comentas lo más sencillo sería tener una tabla con los inicio y fin de mes y cruzar con ella. Si no tenemos la tabla la podemos generar para la ocasión, por ejemplo una CTE con una consulta recursiva que nos devuelva las fechas.
Algo así:
WITH RangoMeses AS -- CTE con consulta recursiva para calcular las fechas
(
SELECT
FechaInicio = DATEFROMPARTS(2012, 1, 1), -- Fecha inicial del rango
FechaFin = EOMONTH(DATEFROMPARTS(2012, 1, 1)) -- Fin del mes (último día)
UNION ALL
SELECT
DATEADD(DAY, 1, FechaFin), -- Día siguiente al último día del mes anterior
EOMONTH(DATEADD(DAY, 1, FechaFin)) -- Fin del mes actual
FROM RangoMeses
WHERE FechaFin < '20121231' -- Ajusta el rango hasta el año deseado
)
SELECT
FechaInicio,
FechaFin,
c = COUNT_BIG(*)
FROM dbo.Votes AS v
INNER JOIN RangoMeses AS r
ON v.CreationDate >= r.FechaInicio
AND v.CreationDate