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)
---------------------------------------------------
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)
@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 NULLDROP 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