IF OBJECT_ID('dbo.fn_dt_dias31') IS NOT NULL
    DROP FUNCTION dbo.fn_dt_dias31
GO
CREATE FUNCTION dbo.fn_dt_dias31
(    
  @pdt_inicial smalldatetime,
  @pdt_final smalldatetime
)    
RETURNS smallint    
AS    
/*******************************************************/
/*** Módulo: Llamado en cualquiera                   ***/
/*** Descripción:                                    ***/
/*** Cuenta la cantidad de dias 31 que existen entre ***/
/*** dos fechas																			 ***/
/*** Autor: Diana Cecilia Rios Peinado               ***/
/*** Fecha: Julio-18-2008                            ***/
/*******************************************************/
BEGIN    
DECLARE     
	@vsi_dias_total smallint,
	@vsi_anio_dde smallint,
	@vsi_anio_hta smallint,
	@vti_mes_dde tinyint,
	@vti_mes_hta tinyint,

	@vti_anio_aux	smallint,
	@vti_mes_aux tinyint,
	@vti_mes_aux_2 tinyint,
	@vti_dia_hta tinyint,
	@vsi_dias_tmp smallint

	SET @vsi_anio_dde = DATEPART(YEAR, @pdt_inicial)
	SET @vsi_anio_hta = DATEPART(YEAR, @pdt_final)
	SET @vti_mes_dde = DATEPART(MONTH, @pdt_inicial)
	SET @vti_mes_hta = DATEPART(MONTH, @pdt_final)
	SET @vti_dia_hta = DATEPART(DAY, @pdt_final)

	--si el dia de la fecha final es diferente de 31, entonces el mes hasta va hasta el mes anterior
	IF @vti_dia_hta <> 31
	BEGIN
		IF @vti_mes_hta = 1
		BEGIN
			SET @vti_mes_hta = 12
			SET @vsi_anio_hta = @vsi_anio_hta - 1
		END
		ELSE
			SET @vti_mes_hta = @vti_mes_hta - 1
	END

	SET @vti_anio_aux = @vsi_anio_dde
	IF (@vsi_anio_dde = @vsi_anio_hta) --si son iguales los años
	BEGIN
			SET @vti_mes_aux = @vti_mes_dde
			SET @vti_mes_aux_2 = @vti_mes_hta
	END
	ELSE
	BEGIN
			SET @vti_mes_aux = @vti_mes_dde
			SET @vti_mes_aux_2 = 12	--inicialmente va del mes inicial hasta el mes 12 del primer año		
	END

	SET @vsi_dias_tmp = 0
	
	WHILE @vti_anio_aux <= @vsi_anio_hta
	BEGIN--ciclo @vti_anio_aux

		WHILE @vti_mes_aux <= @vti_mes_aux_2
		BEGIN --ciclo @vti_mes_aux

			IF @vti_mes_aux = 1 or @vti_mes_aux = 3 or @vti_mes_aux = 5 or @vti_mes_aux = 7 or @vti_mes_aux = 8 or @vti_mes_aux = 10 or @vti_mes_aux = 12
					SET @vsi_dias_tmp = @vsi_dias_tmp + 1			

			SET @vti_mes_aux = @vti_mes_aux + 1
		END--ciclo @vti_mes_aux

		SET @vti_anio_aux = @vti_anio_aux + 1

		IF @vti_anio_aux < @vsi_anio_hta
		BEGIN
			SET @vti_mes_aux = 1 --iria del primero del siguiente año
			SET @vti_mes_aux_2 = 12 --al mes final del siguiente año
		END
		ELSE
		BEGIN
			SET @vti_mes_aux = 1 --iria del primero del siguiente año
			SET @vti_mes_aux_2 = @vti_mes_hta --al mes final del siguiente año
		END

	END--ciclo @vti_anio_aux

	SET @vsi_dias_total = @vsi_dias_tmp

    RETURN @vsi_dias_total       
END    
GO
GRANT EXECUTE ON dbo.fn_dt_dias31 TO PUBLIC
GO
