Wednesday, September 1, 2010

Obtener Numero lunes, Martes, miercoles en un rango de fechas

DECLARE @pd_inicio    AS SMALLDATETIME,
        @pd_fin       AS SMALLDATETIME,
        @pn_dia       AS SMALLINT

DECLARE @ln_total     AS SMALLINT
DECLARE @ln_datepart  AS SMALLINT
SET @ln_total = 0

SET @pd_inicio = '20100601'
SET @pd_fin = '20100630'
SET @pn_dia = 7 -- 1 lunes

PRINT @pn_dia
PRINT DATEPART(dw, @pd_inicio)

SET @ln_datepart = DATEPART(dw, @pd_inicio)


IF @pn_dia < DATEPART(dw, @pd_inicio)
    SET @pd_inicio = DATEADD(week, DATEDIFF(week, 0, @pd_inicio), 6 + @pn_dia)
ELSE
    IF @pn_dia > DATEPART(dw, @pd_inicio)
    SET @pd_fin = @pd_fin - (@pn_dia - DATEPART(dw, @pd_inicio))
--    SET @pd_inicio = DATEADD(
--            week,
--            DATEDIFF(week, 0, @pd_inicio),
--            @pn_dia - DATEPART(dw, @pd_inicio)
--    )

 IF @ln_datepart = 7 AND @pn_dia <> 7--funciona en agosto 2010
    SET @pd_inicio = DATEADD(d, -7, @pd_inicio)

    
WHILE @pd_inicio <= @pd_fin
BEGIN
    PRINT @pd_inicio
    SET @pd_inicio = DATEADD(d, 7, @pd_inicio)
    SET @ln_total = @ln_total + 1
END

SELECT @ln_total
      
       --fucnion origginal con 7 devuelve el sig lunes
       --select    dateadd(week, datediff(week, 0, getdate()),7)




---------------------------------------------------

OTRA FUNCION
IF OBJECT_ID('fn_hrv5_ec_get_numero_dias') IS NOT NULL
    DROP FUNCTION fn_hrv5_ec_get_numero_dias
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION fn_hrv5_ec_get_numero_dias
(
    @pd_inicio  AS SMALLDATETIME,
    @pd_fin     AS SMALLDATETIME,
    @pn_dia     AS SMALLINT --dia de la semana -- lunes = 1
)
RETURNS SMALLINT
AS
BEGIN
    DECLARE @offset  INT,
            @total_dias    AS SMALLINT
  
    SELECT @offset = CASE @pn_dia
                          WHEN 1 THEN 1
                          WHEN 2 THEN 2
                          WHEN 3 THEN 3
                          WHEN 4 THEN 4
                          WHEN 5 THEN 5
                          WHEN 6 THEN 6
                          WHEN 7 THEN 0
                     END
  
    SET @total_dias = DATEDIFF(
            WEEK,
            DATEADD(DAY, -@offset, @pd_inicio),
            DATEADD(DAY, -@offset, @pd_fin)
        )
  
    IF @pn_dia = DATEPART(dw, @pd_inicio)
        SET @total_dias = @total_dias + 1
  
    RETURN @total_dias
END
GO



DECLARE @ld_inicio  AS SMALLDATETIME
DECLARE @ld_fin     AS SMALLDATETIME

SET @ld_inicio = '20100601'
SET @ld_fin = '20100630'


SELECT dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 7),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 1),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 2),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 3),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 4),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 5),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 6)



revisar
http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

No comments:

Post a Comment