Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Veckor i SQL Server

Postades av 2004-12-16 09:30:10 - Mikael Andersson, i forum sql-server/msde, Tråden har 8 Kommentarer och lästs av 1573 personer

Hej

Är det någon som vet varför SQL server tolkar vecka 53 som vecka 1?

Och hur kommer man runt det?

Hälsningar

Mikael Andersson


Svara

Sv: Veckor i SQL Server

Postades av 2004-12-16 09:55:45 - Christoffer Hedgate

Tyvärr är det helt enkelt så Microsoft valt att implementera det i SQL Server. Förste januari räknas alltid som vecka 1 i SQL Server, och vecka 2 börjar då den första söndagen (eller annan veckodag om man ändrat datefirst inställning) på året inträffar. Detta är alltså inte hur ISO-standarden - som vi i Sverige följer - ser ut.

Ett sätt att komma runt det är att skapa en egen tabell med kalenderinformation, t ex ISO-veckonummer för varje datum.


Svara

Sv:Veckor i SQL Server

Postades av 2004-12-16 10:35:36 - Per Karlsson

Om man använder sql server 2000 så kan man gå runt problemet genom att skriva en UDF som tar emot ett datum och returnerar rätt veckonummer.

Microsofts hantering av veckonummer är en gammal goding. De har nog aldrig lyckats med en korrekt implementering, och de verkar inte bry sig om att fixa sina gamla fel heller (t.ex. veckonummerfelet i vb6 kvarstår efter 6 år och ett antal uppdateringar)...

/Pelle


Svara

Sv: Veckor i SQL Server

Postades av 2004-12-16 11:54:10 - Mikael Andersson

OK, Tack båda två för svar.

Vi får väl hitta på något klurigt.

God Jul

Micke


Svara

Sv:Veckor i SQL Server

Postades av 2004-12-19 22:35:15 - Christoffer Hedgate

Sådärja, då har man haft en helg och lite tid på sig att ge ett ordentligt svar på detta problem. Nedanstående kod kan användas för att beräkna ISO veckonummer, dvs enligt den standard vi följer i Sverige, för ett specifikt datum. I detta fallet är det en [tabell] med en kolumn [datumkolumn] som man beräknar iso-vecka för. Fungerar på alla versioner av SQL Server och använder inte nån prestanda-krävande udf.

<code>
SELECT [datumkolumn], CASE

-- Specialfall där datumet ingår i vecka 52 (eller 53) för föregående år
WHEN [datumkolumn] < CASE (DATEPART(dw, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04') + @@DATEFIRST - 1) % 7
WHEN 1 THEN CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04'
WHEN 2 THEN DATEADD(d, -1, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 3 THEN DATEADD(d, -2, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 4 THEN DATEADD(d, -3, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 5 THEN DATEADD(d, -4, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 6 THEN DATEADD(d, -5, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
ELSE DATEADD(d, -6, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
END
THEN
-- Räkna ut veckonummer för dagar som ingår i överlappande vecka 52 eller 53
(DATEDIFF(d,
CASE (DATEPART(dw, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04') + @@DATEFIRST - 1) % 7
WHEN 1 THEN CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04'
WHEN 2 THEN DATEADD(d, -1, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04')
WHEN 3 THEN DATEADD(d, -2, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04')
WHEN 4 THEN DATEADD(d, -3, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04')
WHEN 5 THEN DATEADD(d, -4, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04')
WHEN 6 THEN DATEADD(d, -5, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04')
ELSE DATEADD(d, -6, CAST(YEAR([datumkolumn]) - 1 AS CHAR(4)) + '-01-04')
END,
[datumkolumn]
) / 7) + 1

-- Specialfall där datumet ingår i vecka 1 för kommande år
WHEN [datumkolumn] >= CASE (DATEPART(dw, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04') + @@DATEFIRST - 1) % 7
WHEN 1 THEN CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04'
WHEN 2 THEN DATEADD(d, -1, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04')
WHEN 3 THEN DATEADD(d, -2, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04')
WHEN 4 THEN DATEADD(d, -3, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04')
WHEN 5 THEN DATEADD(d, -4, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04')
WHEN 6 THEN DATEADD(d, -5, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04')
ELSE DATEADD(d, -6, CAST(YEAR([datumkolumn]) + 1 AS CHAR(4)) + '-01-04')
END
THEN 1 -- Alltid vecka 1 förstås

ELSE
-- Räkna ut veckonummer för alla dagar som ej är specialfall ovan
(DATEDIFF(d,
CASE (DATEPART(dw, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04') + @@DATEFIRST - 1) % 7
WHEN 1 THEN CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04'
WHEN 2 THEN DATEADD(d, -1, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 3 THEN DATEADD(d, -2, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 4 THEN DATEADD(d, -3, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 5 THEN DATEADD(d, -4, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
WHEN 6 THEN DATEADD(d, -5, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
ELSE DATEADD(d, -6, CAST(YEAR([datumkolumn]) AS CHAR(4)) + '-01-04')
END,
[datumkolumn]
) / 7) + 1
END
AS IsoWeek
FROM [tabell]
</code>

Om någon vill kontrollera detta och rapportera eventuella fel här vore jag glad. Jag har själv kontrollerat ganska ordentligt, men det skadar ju inte med fler ögon.


Svara

Sv: Veckor i SQL Server

Postades av 2004-12-20 09:41:06 - Per Karlsson

Jag har testat den mot den tabell jag har med datum och veckonummer i (alla dagar från 1990 och 50 år framåt) och veckonummer stämmer överens för alla datum. Bra!

/Pelle


Svara

Sv:Veckor i SQL Server

Postades av 2004-12-20 13:31:20 - Christoffer Hedgate

Perfekt. Har själv suttit och jämfört ett antal datum med kalendrar och det ser korrekt ut ja. Prestandamässigt använde den ungefär 1/10 CPU jämfört med en UDF, så den fungerar bra att köra också. Har skrivit lite mer om den: http://thinkdo.org/blogs/chris/archive/2004/12/20/151.aspx


Svara

Sv: Veckor i SQL Server

Postades av 2004-12-20 21:16:34 - Per Karlsson

Jag har inte tittat närmare på koden, men tror du att den går att förkorta? Man vill ju inte gärna ha så mycket extrakod i 20 procedurer...


Svara

Sv:Veckor i SQL Server

Postades av 2004-12-20 22:28:50 - Christoffer Hedgate

Nej, inte utan att ändra till att t ex lägga in funktionaliteten i en UDF, men då blir det prestandamässigt oerhört sämre eftersom det inte är set-based. Är det för enbart ett datum (i motsats till X rader i en tabell) så kan du naturligtvis anropa en udf eller lagrad procedur som beräknar för det datumet. Sen kan man ju alltid fråga sig om det är en funktion för databasen överhuvudtaget. Kanske ska du bara returnera datumet och låta applikationen som hämtar det avgöra hur veckonummer ska beräknas.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
572
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies