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