2010-02-08 31 views
8

tengo el problema de quenúmero de la semana incorrecto usando DATEPART en SQL Server

select datepart(ww, '20100208') 

está regresando como resultado semana 7 en SQL Server 2000. Sin embargo, 08.02.2010 debe ser semana 6 según la especificación ISO 8601! Esto está causando problemas en los cálculos de la semana de entrega.

¿Qué debo hacer para obtener los valores de los números de semana según ISO 8601?

Respuesta

12

Puede hacerlo fácilmente en SQL 2008, ya que ahora admite isoww como primer argumento de fecha y parte. Sin embargo, esto no estaba en SQL 2000 (o 2005). Hay una función en el artículo this que lo hará por usted en SQL 2000/2005.

En caso de que el blog se desconecte, esta es la función. Vaya a la publicación para obtener más información sobre las semanas ISO y las no 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 por mencionar mi publicación en el blog :-) – SQLMenace

+0

Buena publicación en el blog, de hecho. :-) Entonces, ¿no hay otra manera de obtener el número de semana ISO en SQL Server 2000, excepto mediante el uso de un UDF? – MicSim

+0

@MicSim, desafortunadamente no. Hay un argumento para decir que no lo haga en SQL Server, pero devuelva los datos como están y deje que su código de llamada funcione determine el número de la semana. Pero eso realmente depende de los requisitos exactos, por lo que puede o no vale la pena considerarlo. – AdaTheDev

0

Una manera fácil de hacer esto es utilizar isowk en lugar de wk como se muestra aquí:

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

Como @MicSim y @AdaTheDev mencionados, esto sólo funcionará en las versiones más recientes (> = 2008)

+0

Si bien esto es correcto para las versiones actuales de SQL Server, la pregunta original era sobre SQL Server 2000. El parámetro que menciona funciona solo a partir de la versión 2008 en adelante. Ver la respuesta de AdaTheDev, quien ya lo mencionó. – MicSim

+0

@MicSim tienes razón. Mi error. Respondí con prisa y no presté atención. Lo siento. –

Cuestiones relacionadas