none
Semana esta completa RRS feed

  • Pregunta

  • Hola todos nuevamente me encuentro con un problema

    Lo que pasa es me mandan por parámetro una fecha de inicio ( tipo date ) y una fecha de fin ( date ) es rango lo busco dentro de una tabla lo interesante es que debo de buscar aquellos registros donde la semana este completa , cabe mencionar que la semana es de lunes a domingo, ejemplo

    Fecha_Inicio:  2020-04 -13

    Fecha_Fin: 2020-04-23

    Sabemos que la semana comienza el lunes entonces :

    13 al 18 de abril si puedo buscar ya que cumple con la condición , pero no puede agarrar los datos del 19,20,21,22,23 ya que todavía no pasa una semana,  en este caso si fecha de fin fuera 2020-04-26 entonces si se tomaría los datos que hay en esos días

     De antemano gracias se los agradeceria su apoyo


    Pregunta


    • Editado Dave2203 sábado, 9 de mayo de 2020 0:31
    sábado, 9 de mayo de 2020 0:30

Respuestas

  • Hola Dave2203:

    Puedes utilizar algo de este estilo:

    DECLARE @PARAMINICIO date = '2020-04-13';
    DECLARE @PARAMFINAL date = '2020-04-23';
    
    SET DATEFIRST 1;
    
    WITH CTE
    	 AS (SELECT ROW_NUMBER() OVER(
    				ORDER BY (SELECT NULL) ) AS N
    				FROM sys.objects AS C),
    	 Semana
    	 AS (SELECT case when DATEPART(WEEKDAY, @PARAMINICIO) = 1 then @PARAMINICIO
    				else DATEADD(DAY, 8 - DATEPART(WEEKDAY, @PARAMINICIO), @PARAMINICIO) END AS PrimerDiaRango), 
    	 R
    	 AS (SELECT s.PrimerDiaRango
    			  , DATEADD(week, c.N , s.PrimerDiaRango) AS fecha
    				FROM CTE AS c
    						  CROSS JOIN Semana AS s)
    						  
    	 SELECT PrimerDiaRango
    		  , MAX(fecha) AS UltimoDiaRango
    			FROM R
    			WHERE fecha < @PARAMFINAL AND PrimerDiaRango < fecha
    			GROUP BY PrimerDiaRango;

    Dentro del conjunto Cte haces una numeración para utilizar como desplazamiento para la función dateadd.

    En el conjunto Semana, calculas el primer día de la semana, puesto que el parámetro puede empezar en el día 14, me supongo.

    En el conjunto R, coges el primer día, y luego haces un sumatorio de semanas desde el primer dia hasta el número de desplazamientos que has montado en el cte.

    En la salida final recoges el primer día, y el max(fecha) para así disponer de una columna desde y una columna hasta, que pueda incluir varias semanas.

    Tablas de expresión común correlativas

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-2-correlativos/

    DatePart

    https://docs.microsoft.com/es-es/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver15

    • Marcado como respuesta Dave2203 sábado, 9 de mayo de 2020 22:04
    sábado, 9 de mayo de 2020 7:39

Todas las respuestas

  • No lo se, pero yo lo resolveria en la parte "cliente" (programa)

    IIslas Master Consultant SQL Server

    sábado, 9 de mayo de 2020 1:15
  • Hola Dave2203:

    Puedes utilizar algo de este estilo:

    DECLARE @PARAMINICIO date = '2020-04-13';
    DECLARE @PARAMFINAL date = '2020-04-23';
    
    SET DATEFIRST 1;
    
    WITH CTE
    	 AS (SELECT ROW_NUMBER() OVER(
    				ORDER BY (SELECT NULL) ) AS N
    				FROM sys.objects AS C),
    	 Semana
    	 AS (SELECT case when DATEPART(WEEKDAY, @PARAMINICIO) = 1 then @PARAMINICIO
    				else DATEADD(DAY, 8 - DATEPART(WEEKDAY, @PARAMINICIO), @PARAMINICIO) END AS PrimerDiaRango), 
    	 R
    	 AS (SELECT s.PrimerDiaRango
    			  , DATEADD(week, c.N , s.PrimerDiaRango) AS fecha
    				FROM CTE AS c
    						  CROSS JOIN Semana AS s)
    						  
    	 SELECT PrimerDiaRango
    		  , MAX(fecha) AS UltimoDiaRango
    			FROM R
    			WHERE fecha < @PARAMFINAL AND PrimerDiaRango < fecha
    			GROUP BY PrimerDiaRango;

    Dentro del conjunto Cte haces una numeración para utilizar como desplazamiento para la función dateadd.

    En el conjunto Semana, calculas el primer día de la semana, puesto que el parámetro puede empezar en el día 14, me supongo.

    En el conjunto R, coges el primer día, y luego haces un sumatorio de semanas desde el primer dia hasta el número de desplazamientos que has montado en el cte.

    En la salida final recoges el primer día, y el max(fecha) para así disponer de una columna desde y una columna hasta, que pueda incluir varias semanas.

    Tablas de expresión común correlativas

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-2-correlativos/

    DatePart

    https://docs.microsoft.com/es-es/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver15

    • Marcado como respuesta Dave2203 sábado, 9 de mayo de 2020 22:04
    sábado, 9 de mayo de 2020 7:39
  • Muchas gracias Javi como siempre !!

    Pregunta

    sábado, 9 de mayo de 2020 22:04