2010-02-08 15 views

risposta

12

È possibile eseguire questa operazione in SQL 2008 in modo molto semplice poiché ora supporta isoww come primo argomento datapart. Tuttavia, questo non era in SQL 2000 (o 2005). C'è una funzione nell'articolo this che lo farà per te in SQL 2000/2005.

Nel caso in cui il blog sia offline, ecco la funzione. Vai al post per saperne di più sulle settimane ISO e non ISO.

CREATE FUNCTION ISOweek (@DATE datetime) 
RETURNS int 
AS 
BEGIN 
    DECLARE @ISOweek int 
    SET @ISOweek= DATEPART(wk,@DATE)+1 
     -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104') 
    --Special cases: Jan 1-3 may belong to the previous year 
    IF (@ISOweek=0) 
     SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 
     AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1 
    --Special case: Dec 29-31 may belong to the next year 
    IF ((DATEPART(mm,@DATE)=12) AND 
     ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28)) 
     SET @ISOweek=1 
    RETURN(@ISOweek) 
END 
+0

+1 per aver menzionato il mio post sul blog :-) – SQLMenace

+0

Un buon post sul blog, in effetti. :-) Quindi non c'è altro modo di ottenere il numero della settimana ISO in SQL Server 2000, tranne che usando una UDF? – MicSim

+0

@MicSim, sfortunatamente no. C'è un argomento per dire non farlo in SQL Server, ma restituire i dati così come sono e lasciare che il codice chiamante funzioni determinare il numero della settimana. Ma ciò dipende in realtà da requisiti esatti quindi potrebbe valere la pena o meno. – AdaTheDev

0

Un modo semplice per farlo è quello di utilizzare isowk invece di wk come illustrato di seguito:

select datepart(isowk, '2010-02-08'); 

Come @MicSim e @AdaTheDev menzionati, questo funziona solo nelle versioni più recenti (> = 2008).

+0

Sebbene ciò sia corretto per le versioni correnti di SQL Server, la domanda originale riguardava SQL Server 2000. Il parametro menzionato funziona solo dalla versione 2008 in poi. Vedi la risposta di AdaTheDev, che l'ha già menzionata. – MicSim

+0

@MicSim hai ragione. Errore mio. Ho risposto di fretta e non ho prestato attenzione. Scusate. –

Problemi correlati