Welcome to Sign in | Help

Re: procedura + cursor = intoarce date calendaristice.....dar nu ce mi-as dori - SQL server 2000

  •  09-22-2007, 12:54 AM

    Re: procedura + cursor = intoarce date calendaristice.....dar nu ce mi-as dori - SQL server 2000

    Incearca:

    CREATE TABLE Luna
    (
    Luna INT PRIMARY KEY,
    Denumire NVARCHAR(25),
    DataInceput NVARCHAR(6),
    DataSfarsit NVARCHAR(6),
    )

    INSERT INTO Luna VALUES ( 1  , 'Ianuarie'    , '01/01/' , '31/01/' )
    INSERT INTO Luna VALUES ( 2  , 'Februarie'    , '01/02/' , '28/02/' )
    INSERT INTO Luna VALUES ( 3  , 'Martie'        , '01/03/' , '31/03/' )
    INSERT INTO Luna VALUES ( 4  , 'Aprilie'    , '01/04/' , '30/04/' )
    INSERT INTO Luna VALUES ( 5  , 'Mai'        , '01/05/' , '31/05/' )
    INSERT INTO Luna VALUES ( 6  , 'Iunie'        , '01/06/' , '30/06/' )
    INSERT INTO Luna VALUES ( 7  , 'Iulie'        , '01/07/' , '31/07/' )
    INSERT INTO Luna VALUES ( 8  , 'August'        , '01/08/' , '31/08/' )
    INSERT INTO Luna VALUES ( 9  , 'Septembrie'    , '01/09/' , '30/09/' )
    INSERT INTO Luna VALUES ( 10 , 'Octombrie'    , '01/10/' , '31/10/' )
    INSERT INTO Luna VALUES ( 11 , 'Noiembrie'    , '01/11/' , '30/11/' )
    INSERT INTO Luna VALUES ( 12 , 'Decembrie'    , '01/12/' , '31/12/' )

    DECLARE @dt1 DATETIME    --data inceput
    DECLARE @dt2 DATETIME    --data sfarsit
    SET @dt1 = '2006-12-09'    --YYYY-MM-DD
    SET @dt2 = '2008-03-11'    --YYYY-MM-DD

    --in mod normal validarea de mai jos ar tb. realizata de catre apelant
    --IF ( @dt1 > @dt2 ) RAISERROR ('Eroare: Data 1 trebuie sa fie <= decat Data 2', 16, 1)

    /*eventual schimbi intre ele valorile

    IF ( @dt1 > @dt2 )

    BEGIN 

        DECLARE @dt_aux DATETIME

        SET @dt_aux = @dt1

        SET @dt1 = @dt2

        SET @dt2  = @dt_aux 

    END 

    */

    DECLARE @rezultat TABLE
    (
    Luna INT,
    Denumire NVARCHAR(25),
    DataInceput NVARCHAR(10),
    DataSfarsit NVARCHAR(10)
    )

    DECLARE @i INT, @data_iteratie DATETIME
    SET @i = 0
    SET @data_iteratie = CAST(YEAR(@dt1) AS NVARCHAR(4)) + '-' + CAST(MONTH(@dt1) AS NVARCHAR(2)) + '-1' --conversie implicita NVARCAR -> DATETIME

    WHILE ( YEAR(@data_iteratie) < YEAR(@dt2) ) OR
        ( YEAR(@data_iteratie) = YEAR(@dt2) AND MONTH(@data_iteratie) <= MONTH(@dt2) )
    BEGIN
        SET @i = @i + 1

        DECLARE @an INT, @bisect NCHAR(1)
        SET @an = YEAR(@data_iteratie)
        IF ( @an % 4 = 0 AND NOT (@an % 100 = 0 AND @an % 400 != 0) )
            SET @bisect = 'D'
        ELSE
            SET @bisect = 'N'

        INSERT INTO @rezultat
        SELECT @i,
            L.Denumire,
            L.DataInceput+CAST(YEAR(@data_iteratie) AS NVARCHAR(4) ),
            CASE
                WHEN MONTH(@data_iteratie) = 2 AND @bisect = 'D' THEN '29/02/'
                ELSE L.DataSfarsit
            END + CAST(YEAR(@data_iteratie) AS NVARCHAR(4) )
        FROM Luna L
        WHERE L.Luna = MONTH(@data_iteratie)

        SET @data_iteratie = DATEADD(mm,1,@data_iteratie) --trecem la luna urmatoare
    END

    UPDATE @rezultat
    SET DataInceput = REPLACE(STR(DAY(@dt1),2),' ','0') + SUBSTRING(DataInceput,3,25)
    WHERE Luna = 1

    UPDATE @rezultat
    SET DataSfarsit = REPLACE(STR(DAY(@dt2),2),' ','0') + SUBSTRING(DataSfarsit,3,25)
    WHERE Luna = (SELECT MAX(Luna) FROM @rezultat)



    SELECT *
    FROM @rezultat

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