>Si passa così a febbraio. Quanti sono gli utenti iscritti (DataIn<=01/02/2006)
>che risultano ancora iscritti (DataOut>=01/03/2006 o NULL)?
>1 2 3 4 e 5 soddisfano la prima condizione, ma 1 2 e 3 non soddisfano
>più la seconda: a febbraio gli utenti iscritti sono 2 (il 4 e
>il 5)
No, anche il 6 soddisfa entrambe le condizioni.
Prova a vedere il seguente esempio:
USE tempdb;
GO
CREATE TABLE dbo.Tabella
(
Id int NOT NULL PRIMARY KEY,
DataIn datetime NOT NULL,
DataOut datetime NULL
);
INSERT dbo.Tabella VALUES (1, '20060101', '20060202');
INSERT dbo.Tabella VALUES (2, '20060101', '20060202');
INSERT dbo.Tabella VALUES (3, '20060101', '20060102');
INSERT dbo.Tabella VALUES (4, '20060101', '20060302');
INSERT dbo.Tabella VALUES (5, '20060130', '20060302');
INSERT dbo.Tabella VALUES (6, '20060130', NULL);
INSERT dbo.Tabella VALUES (7, '20060220', '20060630');
GO
CREATE FUNCTION dbo.ufn_DateInterval(
@StartDate datetime,
@EndDate datetime
)
RETURNS @DateInterval TABLE(
StartDate datetime NOT NULL,
EndDate datetime NOT NULL
)
BEGIN
DECLARE @Date datetime
DECLARE @NextMonth datetime
SET @Date = @StartDate
WHILE @Date < @EndDate
BEGIN
-- Primo del mese successivo
SET @NextMonth = DATEADD(month, 1,
CONVERT(char(6), @Date, 112) + '01')
IF @NextMonth > @EndDate
SET @NextMonth = @EndDate
-- Popolo la tabella
INSERT @DateInterval VALUES (@Date, @NextMonth)
-- Mese successivo
SET @Date = @NextMonth
END
RETURN
END
GO
/* Query */
SELECT
MONTH(DI.StartDate) AS Mese
, YEAR(DI.StartDate) AS Anno
, COUNT(*) AS UtentiAttivi
FROM dbo.Tabella AS T
, dbo.ufn_DateInterval('20060101', '20060630') AS DI
WHERE T.DataIn <= DI.StartDate
AND (T.DataOut IS NULL OR T.DataOut >= DI.EndDate)
GROUP BY
MONTH(DI.StartDate)
, YEAR(DI.StartDate);
GO
/* Output:
Mese Anno UtentiAttivi
----------- ----------- ------------
1 2006 3
2 2006 3
3 2006 2
4 2006 2
5 2006 2
6 2006 2
(6 row(s) affected)
*/
DROP FUNCTION dbo.ufn_DateInterval;
DROP TABLE dbo.Tabella;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org