2010-02-08 22 views
8

BenYanlış hafta numarası

select datepart(ww, '20100208') 

olmalıdır 08.02.2010 SQL Server 2000 Ancak yılında hafta 7 sonucu dönüyor sorunu var hafta 6ISO 8601 teknik özelliklerine göre! Bu, teslimat haftası hesaplamalarında sorunlara neden oluyor.

ISO 8601'e göre hafta numarası değerleri almak için ne yapmalıyım?

cevap

12

Bunu, SQL 2008 içinde, artık ilk datepart argümanı olarak isoww desteklediğinden yapabilirsiniz. Ancak, bu SQL 2000'de (veya 2005) değildi. SQL 2000/2005'te sizin için yapacak olan this makalesinde bir işlev vardır.

Blog çevrimdışı duruma geçerse, işte işte budur. ISO ve ISO dışı haftalar hakkında daha fazla bilgi edinmek için yayına gidin. burada gösterildiği gibi

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 Blog gönderilerimden bahsetmek için +1 – SQLMenace

+0

İyi blog yazısı, gerçekten. :-) Yani bir UDF kullanarak dışında, SQL Server 2000'de ISO hafta sayısını almanın başka bir yolu yok mu? – MicSim

+0

@MicSim, maalesef değil. Bunu SQL Server'da yapmamanız için bir argüman var, ancak verileri olduğu gibi döndür ve çağrı kodunuzun hafta sayısını belirlemesine izin verin. Ama bu gerçekten tam gereksinimlere bağlıdır, bu yüzden düşünmeye değer olabilir veya olmayabilir. – AdaTheDev

0

Bunu yapmanın bir kolay yolu wk yerine isowk kullanmaktır:

select datepart(isowk, '2010-02-08'); 
gibi @MicSim ve @AdaTheDev söz

, bu sadece (yeni sürümlerinde çalışacak> = 2008).

+0

Geçerli SQL Server sürümleri için bu doğru olsa da, özgün soru SQL Server 2000'le ilgili idi. Söz ettiğiniz parametre yalnızca 2008 sürümünden itibaren çalışır. Daha önce bahsettiği AdaTheDev'in cevabına bakın. – MicSim

+0

@MicSim haklısınız. Benim hatam. Acele ettim ve dikkat etmedim. Afedersiniz. –