Welcome to Sign in | Help

Calcul zile concediu consumate lunar

  •  09-25-2007, 4:59 PM

    Calcul zile concediu consumate lunar

    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 )

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems