>si può creare e se si come una funzione che mi restituisca sempre
>il primo giorno del mese pèartendo solamente da una data che
>può essere lo stesso primo del giorno oppure un qualsiasi giorno
>di un mese x.
Ciao Fabio,
Si, è possibile ottenere quello che chiedi in diversi modi.
Ti illustrerò un metodo basato esclusivamente sulle funzioni DATEADD e DATEDIFF che non comporta alcun cast implicito a varchar, ottenendo quindi prestazioni migliori
L'algoritmo è molto semplice: calcoliamo il numero di mesi tra la data passata come argomento ed una data base (ad esempio l'1 gennaio 1900), poi sommiamo questo numero di mesi alla data base, ottenendo il risultato sperato
L'1 gennaio 1900 equivale alla base date del datatype datetime, pertanto equivale al numero 0.
USE tempdb;
GO
CREATE FUNCTION dbo.ufn_GetFirstMonthDay(
@Today datetime
)
RETURNS datetime
BEGIN
RETURN DATEADD(month, DATEDIFF(month, 0, @Today), 0);
END
GO
SELECT dbo.ufn_GetFirstMonthDay('20080601') AS FirstMonthDay
UNION ALL
SELECT dbo.ufn_GetFirstMonthDay(CURRENT_TIMESTAMP)
UNION ALL
SELECT dbo.ufn_GetFirstMonthDay('20080630');
/* Output:
FirstMonthDay
-----------------------
2008-06-01 00:00:00.000
2008-06-01 00:00:00.000
2008-06-01 00:00:00.000
(3 row(s) affected)
*/
DROP FUNCTION dbo.ufn_GetFirstMonthDay;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org