none
Obtener las fechas del mes RRS feed

  • Pregunta

  • Hola que tal!, mi consulta es como obtener las fechas de un mes...

    Necesito realizar un Storeprocedure que devuelva las fechas del mes, desde un dia antes del actual hasta el ultimo dia del mes, por ejemplo si ejecuto el Storeprocedure hoy 20/08/2013 que me devuelva las fechas desde 19/08/2013 hasta el 31/08/2013

    martes, 20 de agosto de 2013 14:50

Respuestas

  • Hola:

    Una forma es así, utilizando CTEs recursivos:

    DECLARE @hoy DATE = GETDATE()
    
    SELECT DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
    
    ;WITH miCTE AS 
    (
    	SELECT DATEADD(d,-1,@hoy) as fecha
    	UNION ALL
    	SELECT DATEADD(d,1,fecha) as fecha
    	FROM miCTE 
    	WHERE fecha < DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,@hoy)+1,0))
    )
    SELECT * FROM miCTE 

    El resultado que buscas es el segundo resultset, el primero solo es ilustrativo para comprobar la fecha de ayer y la ultima fecha del mes.

    SALUDOS!


    Sergio Sánchez Arias
    Oaxaca,México
    AYÚDANOS A AYUDARTE

    • Editado Sergio S Arias martes, 20 de agosto de 2013 15:17 jkl
    • Propuesto como respuesta José Barba martes, 20 de agosto de 2013 15:34
    • Marcado como respuesta draw507 martes, 20 de agosto de 2013 15:47
    martes, 20 de agosto de 2013 15:17

Todas las respuestas

  • Hola:

    Una forma es así, utilizando CTEs recursivos:

    DECLARE @hoy DATE = GETDATE()
    
    SELECT DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
    
    ;WITH miCTE AS 
    (
    	SELECT DATEADD(d,-1,@hoy) as fecha
    	UNION ALL
    	SELECT DATEADD(d,1,fecha) as fecha
    	FROM miCTE 
    	WHERE fecha < DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,@hoy)+1,0))
    )
    SELECT * FROM miCTE 

    El resultado que buscas es el segundo resultset, el primero solo es ilustrativo para comprobar la fecha de ayer y la ultima fecha del mes.

    SALUDOS!


    Sergio Sánchez Arias
    Oaxaca,México
    AYÚDANOS A AYUDARTE

    • Editado Sergio S Arias martes, 20 de agosto de 2013 15:17 jkl
    • Propuesto como respuesta José Barba martes, 20 de agosto de 2013 15:34
    • Marcado como respuesta draw507 martes, 20 de agosto de 2013 15:47
    martes, 20 de agosto de 2013 15:17
  • Además de la respuesta de Sergio, hay otras muchas más alternativas para resolver tu problema. Sin embargo, una de las más sencillas sería crear una tabla calendario que almacenara las fechas, en donde tu procedimiento por tanto simplemente se encargaría de filtrar por el intervalo indicado.

    La razón de proponer esa tabla calendario es que es muy útil ya que, junto con una de números, ayuda a resolver multitud de escenarios que de otra forma sería muy difícil y poco eficiente. Hay muchos artículos que explican más detalladamente porqué es recomendable tenerla, por ejemplo este mismo

    martes, 20 de agosto de 2013 15:37
  • Totalmente de acuerdo contigo Carlos, de hecho la tabla numerica que comentas yo lo vi aplicado (y perfectamente explicado) en un libro de Itzik Ben-Gan y llevada a la practica me ha ido de maravilla en muchos escenarios.

    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez

    martes, 20 de agosto de 2013 17:28
  • Yo también estoy de acuerdo :) había escuchado hablar sobre esas tablas "temporales" necesarias, hasta ahorita solo he necesitado de la de números pero evitas crear la tabla temporal por cada ejecución si creas una tabla fija y solo extraes los datos que necesitas mediante filtros :)


    Sergio Sánchez Arias
    Oaxaca,México
    AYÚDANOS A AYUDARTE

    martes, 20 de agosto de 2013 19:28