none
Consulta SQL Count con Fechas RRS feed

  • Pregunta

  • Hola buenas tengo un problema con una consultad en bdd y es la siguiente: como mostrar cuantas veces desde la fecha de nacimiento(fecha X), hasta hoy(sysdate), ha caído sábado(dia x de la semana).
    martes, 28 de marzo de 2017 0:48

Respuestas

Todas las respuestas

  • Hola, prueba con este:

    DECLARE @FechaDesde DATE = '19701124';
    DECLARE @FechaHasta DATE = GetDate();
    	 
    	--CTE recursivo para generar las fechas
    	WITH SecuenciaFechas(Fecha, Dia) AS 
    	(SELECT @FechaDesde, DATEPART(dw,@FechaDesde) as Fecha
    	 UNION ALL 
    	 SELECT DATEADD(DAY, 1, Fecha), DATEPART(dw, DATEADD(DAY, 1, Fecha))
    	 FROM SecuenciaFechas 
    	 WHERE Fecha < @FechaHasta) 
    	--Consulta final en base al CTE para contar los sábados
        SELECT COUNT(*) AS Sabados
    	FROM SecuenciaFechas Where Dia = 6
    	OPTION (MAXRECURSION 32767)

    Aquí he creado un CTE recursivo para que genere la secuencia de fechas desde la fecha de nacimiento hasta la fecha actual. La secuencia incluye el día de la semana, siendo 1 el día lunes y 7 el domingo. Lo que hacemos luego es contar los días con el número 6, que corresponden a los días sábado

    Ten en cuenta que se debe usar la opción MAXRECURSION, para que el CTE recursivo pueda iterar más alla del valor por defecto de 100. EL valor mayor permitido es de 32,767 iteraciones. Esto te permite aplicar este proceso para un máximo de 89 años

    Espero que esto resuelva tu problema.

    Suerte!

    Alberto

    martes, 28 de marzo de 2017 2:27
  • StoougVioleitni,

    Siendo que es un día de siete el que quieres contabilizar basta con dividir la cantidad de días del rango -desde la fecha de nacimiento hasta el último sábado- entre siete, por ejemplo:

    DECLARE @FechaNacimiento datetime= '19701124' 
    
    SET DATEFIRST 7; 
    SELECT (DATEDIFF(DAY, @FechaNacimiento, 
                    DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()), GETDATE()))/7) + 1;
    
    --Resultado: 2418



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 28 de marzo de 2017 3:44
  • Una forma seria usando una fecha ancla que haya sido Sabado (ej. 01/06/1900), lo cual es muy util para unos cuantos calculos de fecha como previo dia de semana, proximo dia de semana inclusivo o exclusivo, y apartir de ella:

    - Calcular el Sabado proximo inclusivo a la fecha de inicio (@FechaNacimiento)

    - Calcular el Sabado previo inclusivo a la fecha final (fecha del sistema)

    - Calcular la diferencia de semanas entre las fechas previamente calculadas y sumar uno porque el calculo es inclusivo.

    Este metodo funciona sin tener que cambiar ningun seteo.

    Ejemplo:

    DECLARE
    	@sdt date = '19701124',
    	@edt date = CURRENT_TIMESTAMP;
    
    SELECT
    	DATEDIFF(WEEK,
    	DATEADD(DAY, ((DATEDIFF(DAY, '19000106', DATEADD(DAY, -1, @sdt)) / 7) * 7) + 7, '19000106'), -- Sabado proximo inclusive
    	DATEADD(DAY, (DATEDIFF(DAY, '19000106', @edt) / 7) * 7, '19000106') -- Sabado anterior inclusive
    	) + 1 AS num_Sabados;

    Te recomiendo la lectura de estos articulos sobre aritmetica de fechas.

    http://sqlmag.com/t-sql/datetime-calculations-part-1

    http://sqlmag.com/t-sql/datetime-calculations-part-2

    http://sqlmag.com/t-sql/datetime-calculations-part-3

    http://sqlmag.com/t-sql/datetime-calculations-part-4

    http://sqlmag.com/t-sql/datetime-calculations-part-5


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    martes, 28 de marzo de 2017 12:57