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

КОМЕНТАРІ • 6

  • @wilmartinezp
    @wilmartinezp Місяць тому +1

    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

    • @SoyDBA
      @SoyDBA  Місяць тому +1

      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.

  • @santymarchulo
    @santymarchulo Місяць тому

    Espectacular, gracias por la explicación, buscaba un canal con estas características

    • @SoyDBA
      @SoyDBA  Місяць тому

      Gracias a ti @Santymarchulo. Si tienes alguna sugerencia o tema del que te gustaría que hable me lo comentas.

  • @ignacioapa1092
    @ignacioapa1092 Місяць тому

    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.

    • @SoyDBA
      @SoyDBA  Місяць тому

      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