salve,
anflam ha scritto:
Grazie per la risposta
cmq se invece vorrei evitare di usare la tabella calendario e estrarre i giorni equivalenti al sabato e la domenica di quel mese?
mi viene da pensare solo a porcherie...
ad esempio la seguente procedura, con parametri interi di mese e anno, popola una tabella temporanea e ritorna tutti i sabati e domeniche del mese utilizzando la funzione DATEPART( weekday , ... ) ...
continuo a non essere convinto della soluzione in quanto mancano ad esempio le festivita' nazionali, festivita' locali, festivita' aziendali e quant'altro...
ripeto... dovresti popolare una tabella calendario..
saluti
<----------->
IF OBJECT_ID ( 'dbo.usp_GiorniFestivi' ) <> 0
DROP PROCEDURE dbo.usp_GiorniFestivi
GO
CREATE PROCEDURE dbo.usp_GiorniFestivi (
@m int ,
@y int
)
AS BEGIN
/* procedura : dbo.usp_GiorniFestivi */
/* descrizione: */
/* procedura di estrazione dei fine settimana */
/* */
/* parametri : */
/* - @m int mese di ricerca */
/* - @y int anno di ricerca */
/* */
/* output : tabellare */
/* return : (null = 0) */
SET NOCOUNT ON
DECLARE @firstDay datetime , @lastDay datetime
DECLARE @currDateFirst int
CREATE TABLE #giorni ( giorno datetime )
-- ottiene il DATEFIRST corrente
SET @currDateFirst = @@DATEFIRST
-- triviale validazione dei parametri
IF @m IS NULL AND @y IS NULL GOTO HELP
IF @m IS NULL OR @m < 1 OR @m > 12
SET @m = DATEPART( m , GETDATE() )
IF @y IS NULL OR @y < 1970
SET @y = DATEPART( yy, GETDATE() )
-- primo ed ultimo giorno del mese interessante
SET @firstDay = CONVERT(varchar, @y) + RIGHT('0' + CONVERT( varchar, @m),2) + '01'
SET @lastDay = DATEADD( y, -1, DATEADD ( mm , 1 , @firstDay ))
-- popolamento della tabella temporanea
DECLARE @d datetime
SET @d = @firstDay
WHILE @d <= @lastDay BEGIN
INSERT INTO #giorni VALUES ( @d )
SET @d = DATEADD( d, 1 , @d )
END
-- impostazione del DATEFIRST
-- necessaro alla verifica
IF @currDateFirst <> 1
SET DATEFIRST 1
-- estrazione di domeniche e sabati
SELECT * --, DATEPART( weekday , giorno )
FROM #giorni
WHERE DATEPART( weekday , giorno ) = 7
OR DATEPART( weekday , giorno ) = 6
-- CLEANUP
-- ripristino del DATEFIRST originale
IF @currDateFirst <> @@DATEFIRST
SET DATEFIRST @currDateFirst
-- drop tabella temporanea
DROP TABLE #giorni
RETURN 0
HELP:
DECLARE @txt varchar(8000)
SET @txt =
'-- procedura : dbo.usp_GiorniFestivi' + CHAR(10) +
'-- descrizione:' + CHAR(10) +
'-- procedura di estrazione dei fine settimana' + CHAR(10) +
'--' + CHAR(10) +
'-- parametri :' + CHAR(10) +
'-- - @m int mese di ricerca' + CHAR(10) +
'-- - @y int anno di ricerca' + CHAR(10) + CHAR(10) +
'-- output : tabellare' + CHAR(10) +
'-- return : (null = 0)' + CHAR(10) + CHAR(10) +
'-- utilizzo :' + CHAR(10) +
'DECLARE @m int, @y int' + CHAR(10) +
'SELECT @m = MONTH(GETDATE()) , @y = YEAR(GETDATE())' + CHAR(10) +
'EXEC dbo.usp_GiorniFestivi @m , @y'
PRINT @txt
RETURN -1
END
-- Test
EXEC dbo.usp_GiorniFestivi 10 , 2005
EXEC dbo.usp_GiorniFestivi NULL , 2005
EXEC dbo.usp_GiorniFestivi 10 , NULL
EXEC dbo.usp_GiorniFestivi NULL , NULL
EXEC dbo.usp_GiorniFestivi 13 , 2005
EXEC dbo.usp_GiorniFestivi 0 , 2005