Urmatoarea problema mi-a fost adresata de un membru al forumului:
cum se poate calcula si afisa nr de zile consumate LUNAR din concediu (rezultatul trebuie sa fie sub format unui set de inregistrari sub format Luna - NrZileConsumateInLunaRespectiva) plecand de la data de start a perioadei de concediu si de la nr. zilelor de concediu ?
Exemplu: 15 zile concediu incepand cu data de '2007-01-21'
Rezultat asteptat:
2007-01 8
2007-02 7
O posibila solutie (brută):
--se adauga doar acele zile nelucratoare care nu sunt in weekend ( != S/D )
CREATE TABLE ZileNelucratoare (DataCalendaristica DATETIME PRIMARY KEY)
INSERT INTO ZileNelucratoare VALUES ( '2007-01-01' )
INSERT INTO ZileNelucratoare VALUES ( '2007-01-02' )
INSERT INTO ZileNelucratoare VALUES ( '2007-02-08' ) --cu titlu de exemplu
-- 0=zi lucratoare / 1=zi nelucratoare
CREATE FUNCTION EsteZiNelucratoare( @dt DATETIME )
RETURNS TINYINT
BEGIN
DECLARE @rezultat TINYINT
IF ( DATEPART( dw , @dt ) = 7 /*sambata*/ OR DATEPART( dw , @dt ) = 1 /*duminica*/ ) --vezi http://sqlserver.ro/forums/thread/2744.aspx
SET @rezultat = 1
ELSE IF EXISTS(SELECT DataCalendaristica
FROM ZileNelucratoare
WHERE DataCalendaristica = @dt)
SET @rezultat = 1
ELSE
SET @rezultat = 0
RETURN @rezultat
END
CREATE FUNCTION ZileConcediu( @dt_start DATETIME , @nr_zile INT)
RETURNS @rez TABLE ( LunaZi DATETIME , NrZileConcediuConsumate INT)
AS
BEGIN
DECLARE @luna_curenta INT, @i INT, @zile_lunare_concediu_consumate INT
SET @luna_curenta = MONTH(@dt_start)
SET @i = -1
SET @zile_lunare_concediu_consumate = 0
WHILE ( @nr_zile > 0 )
BEGIN
SET @i = @i + 1
DECLARE @dt_curenta DATETIME
SET @dt_curenta = DATEADD( dd , @i , @dt_start )
IF ( @luna_curenta != MONTH(@dt_curenta) )
BEGIN
INSERT INTO @rez VALUES (@dt_curenta,@zile_lunare_concediu_consumate)
SET @luna_curenta = MONTH(@dt_curenta)
SET @zile_lunare_concediu_consumate = 0
END
IF ( dbo.EsteZiNelucratoare(@dt_curenta) = 0 )
BEGIN
--PRINT CAST( @dt_curenta AS NVARCHAR(25) ) + ' / ' + CAST(@nr_zile AS NVARCHAR(25))
SET @zile_lunare_concediu_consumate = @zile_lunare_concediu_consumate + 1
SET @nr_zile = @nr_zile - 1
END
END
INSERT INTO @rez VALUES (@dt_curenta,@zile_lunare_concediu_consumate)
RETURN
END
SELECT * FROM dbo.ZileConcediu( '2007-01-21' , 45 )