2010-02-08 2 views
8

나는잘못된 주 번호는

select datepart(ww, '20100208') 

을해야 2010년 2월 8일 SQL 서버 2000 그러나 주 7 결과로 반환하는 문제를 가지고 주 6ISO 8601 사양에 따라! 이로 인해 배달 주 계산에 문제가 발생합니다.

ISO 8601에 따라 주 숫자 값을 얻으려면 어떻게해야합니까?

답변

12

이제 SQL 2008에서 이것을 수행 할 수 있습니다. 이는 첫 번째 datepart 인수로 isoww을 지원하기 때문에 매우 쉽습니다. 그러나 이것은 SQL 2000 (또는 2005)에 없습니다. SQL 2000/2005에서 당신을 위해 그것을 할 this 문서에 함수가 있습니다.

블로그가 오프라인으로 전환되는 경우 다음과 같은 기능이 있습니다. ISO 및 비 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 내 블로그 게시물 :-)을 언급합니다. – SQLMenace

+0

좋은 블로그 게시물입니다. :-) 따라서 UDF를 사용하는 경우를 제외하고는 SQL Server 2000에서 ISO 주 수를 구할 수있는 다른 방법이 없습니까? – MicSim

+0

@MicSim, 불행히도 아닙니다. SQL Server에서는이 작업을 수행하지 말고 데이터를있는 그대로 반환하고 전화 코드로 주 번호를 결정할 수있는 인수가 있습니다. 그러나 그것은 정확한 요구 사항에 따라 달라 지므로 고려할 가치가 있거나 없을 수도 있습니다. – AdaTheDev

0

이 작업을 수행하는 쉬운 방법 중 하나는 wk 대신 isowk을 사용하는 것입니다

select datepart(isowk, '2010-02-08'); 
처럼 @MicSim 및 @AdaTheDev 언급

, 이것은 단지 (최신 버전에서 작동합니다> = 2008).

+0

이것이 현재 SQL Server 버전에는 맞지만 원래 질문은 SQL Server 2000에 관한 것입니다. 언급 한 매개 변수는 2008 년 이후 버전에서만 작동합니다. 이미 언급 한 AdaTheDev의 답변을 참조하십시오. – MicSim

+0

@MicSim 당신 말이 맞습니다. 내 실수. 나는 서둘러 대답했고주의를 기울이지 않았다. 죄송합니다. –

관련 문제