Machetes Varios

apuntes varios erp cwa logic ( ahora SoftLand Logic ) – sql y veremos que otra cosa

Funcion para Numerar Semanas


La idea es clasificar las fechas en semanas dentro del año. En la zona fin de la última semana de un año y comienzo de la otra, se pasarán los días a la semana del año que tenga más días.

Ej: el 31/12/2001 ( lunes ) pasa a la primera semana del 2002

El 01 y 02 del año 2005 ( sábado y domingo ) pasan a la última semana del 2004.

Ejemplos

--SELECT DBO.Usr_FN_SemanaEstadistica('20011231') -->> lunes - 200201
--SELECT DBO.Usr_FN_SemanaEstadistica('20011230')-- 200152
--SELECT DBO.Usr_FN_SemanaEstadistica('20050101')-- 200453
--SELECT DBO.Usr_FN_SemanaEstadistica('20050102')--200453
--SELECT DBO.Usr_FN_SemanaEstadistica('20050103')--200501
--SELECT DBO.Usr_FN_SemanaEstadistica('20050109')--200501
 

CREATE FUNCTION Usr_FN_SemanaEstadistica
(
	@Fecha DATETIME
)
RETURNS INTEGER
AS
-- Retorna el Número de Semana Estadística en el formato AAAASS
-- Criterios:
-- Si para un año dado el 01 de enero cae Viernes,Sabado o Domingo
-- La primera Semana de ese año comenzará el lunes siguiente
-- Pasando los días entre el 01/01 y el lunes a la ultima semana de  año anterior
-- Si el 31/12 Cae Lunes,Martes o Miercoles pasa la semana al año siguiente
-- Con lo cual la ultima semana empieza 7 días antes
--SELECT DBO.Usr_FN_SemanaEstadistica('20011231') -->> lunes - 200201
--SELECT DBO.Usr_FN_SemanaEstadistica('20011230')-- 200152
--SELECT DBO.Usr_FN_SemanaEstadistica('20050101')-- 200453
--SELECT DBO.Usr_FN_SemanaEstadistica('20050102')--200453
--SELECT DBO.Usr_FN_SemanaEstadistica('20050103')--200501
--SELECT DBO.Usr_FN_SemanaEstadistica('20050109')--200501
BEGIN
	-- Declare the return variable here
	DECLARE @Result INTEGER,
			@ANO INTEGER,
			@DIASEMPS INTEGER, -- día de la semana del primer dia del año
			@DIASEMUS INTEGER, --día de la semana ultimo dia del año
			@PD DATETIME, --Primer día del año
			@UD DATETIME, --Ultimo día del año
			@SEMANA INTEGER,-- Semana Calculada para la Fecha
			@MARCA INTEGER -- Se pondra en 1 cuando los calculos esten listos

	SELECT @MARCA = 0

	WHILE @MARCA  1
	BEGIN

		SELECT @ANO = DATEPART(year,@FECHA)
		--------------------------------------------------------------------------------
		-- PRIMER DIA DEL AÑO ESTADISTICO
		---------------------------------------------------------------------------------
		SELECT @PD = DATEADD(year,DATEDIFF(year,0,@FECHA),0)--01 de enero
		-- LLevo el día  al lunes siguiente o al anterior
		SELECT @DIASEMPS = DATEDIFF(day,0,@PD)%7+1  -- 1 Lunes, 2 Martes Etc sqlmag id 95202
		IF @DIASEMPS >4 -- Viernes, Sábado o Domingo
			SELECT @PD = DATEADD(day,DATEDIFF(day,0,@PD)/7*7+7,0)----@PD + (7-@DIASEMPS+1) --> proximo lunes
		ELSE
			SELECT @PD = DATEADD(day,DATEDIFF(day,0,@PD)/7*7,0)--@PD - (@DIASEMPS-1)----> lunes anterior INCLUSIVE

		--------------------------------------------------------------------------------
		-- ULTIMO DIA DEL AÑO ESTADISTICO
		------------------------------------------------------------------------------

		SELECT @UD = DATEADD(year,DATEDIFF(year,0,@FECHA)+1,0)-1 -- 31 de diciembre

		-- LLevo el día  al domingo siguiente o al anterior
		SELECT @DIASEMUS = DATEDIFF(day,0,@UD)%7+1  -- 1 Lunes, 2 Martes Etc sqlmag id 95202
		IF @DIASEMUS   Ultimo domingo --sql mag 95271
		ELSE
			SELECT @UD =DATEADD(day,DATEDIFF(day,6,@UD-1)/7*7,6)+7 --proximo domingo --sql mag 95271

		IF @FECHA BETWEEN @PD AND @UD
			SELECT @MARCA = 1
		ELSE
			IF @FECHA < @PD
				SELECT @FECHA = @FECHA -1
			ELSE
				SELECT @FECHA = @FECHA + 1
	END

	SELECT @SEMANA = (DATEDIFF(day,@PD,@FECHA ))/7 +1

	SELECT @Result = @ANO * 100 + @SEMANA	

	RETURN @Result

END

junio 17, 2008 - Posted by | Transact SQL | ,

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: