>Solo che ho un piccolo problema legato alla tipologia di dato
Questo è un esempio compatibile con SQL Server 2000 e superiori che dovrebbe soddisfare le tue esigenze:
USE tempdb;
CREATE TABLE dbo.Orders(
CustomerID char(5) NOT NULL,
OrderDate datetime NOT NULL
);
INSERT dbo.Orders VALUES('ALFKI', '19970101 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971003 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971013 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971101 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971102 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971130 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971201 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971205 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19971231 00:00:00.000');
INSERT dbo.Orders VALUES('ALFKI', '19980101 00:00:00.000');
GO
CREATE FUNCTION dbo.ufn_GetLastMonthDay(
@Date datetime
)
RETURNS datetime
BEGIN
RETURN DATEADD(month, DATEDIFF(month, 0, @Date) + 1, 0) - 1;
END
GO
CREATE FUNCTION dbo.ufn_ConcatenaGiorni(
@CustomerID char(5),
@Anno int,
@Mese int
)
RETURNS varchar(122)
BEGIN
DECLARE @Output varchar(122);
SET @Output = '';
/* Calcolo il primo del mese */
DECLARE @OrderDate datetime;
SET @OrderDate = DATEADD(year, @Anno - 1900, 0) + DATEADD(month, @Mese - 1, 0);
SELECT @Output = @Output + ', ' + CONVERT(char(2), OrderDate, 103)
FROM dbo.Orders
WHERE CustomerID = @CustomerID
AND OrderDate BETWEEN @OrderDate AND dbo.ufn_GetLastMonthDay(@OrderDate)
ORDER BY OrderDate;
RETURN STUFF(@Output, 1, 2, '');
END
GO
SELECT
Q.*
, dbo.ufn_ConcatenaGiorni(Q.CustomerID, Q.Anno, Q.Mese) AS Giorni
FROM (
SELECT
CustomerID
, YEAR(OrderDate) AS Anno
, MONTH(OrderDate) AS Mese
FROM dbo.Orders
WHERE CustomerID = 'ALFKI'
GROUP BY CustomerID, YEAR(OrderDate), MONTH(OrderDate)
) AS Q;
/* Output:
CustomerID Anno Mese Giorni
---------- ----------- ----------- -----------
ALFKI 1997 1 01
ALFKI 1997 10 03, 13
ALFKI 1997 11 01, 02, 30
ALFKI 1997 12 01, 05, 31
ALFKI 1998 1 01
(5 row(s) affected)
*/
DROP FUNCTION dbo.ufn_ConcatenaGiorni, dbo.ufn_GetLastMonthDay;
DROP TABLE dbo.Orders;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org