Jag vill kunna ta ut innevarande veckonummer baserat på ett datum. i vb kastar man på ytterligare 2 variabler: Precis som Pelle säger så beräknas veckonummer i Sverige från den första veckan som består av minst 4 dagar (alltså inte första måndagen på året). Tyvärr verkar det inte finnas något sätt att bestämma detta i SQL Server. Märkligt. Du kan åtminstone sätta vilken dag som är första dag i veckan så här: Tack för tipsen. Det där med hur första veckan räknas, hade jag missat helt 8-)SQL-Server och veckonummer
Typ:
select datepart(wk, '2000-11-15')
Problemet är att i detta fall returneras 47, men här i Sverige
skall detta vara vecka 46.
I Sverige börjar vecka 1 den första måndagen. Tex I år så
börjar vecka 1 den 3 januari. I SQL-Server verkar vecka 1 räknas
från den 1 januari.
Att ändra regionala inställningar påverkar inte.
Någon som vet hur man kringgår detta på ett smart sätt.Sv: SQL-Server och veckonummer
x = DatePart(wk, "2000-11-15", vbThursday, vbFirstFourDays)
där vbThursday = 5 och vbFirstFourDays = 2
/PelleSv: SQL-Server och veckonummer
SET DATEFIRST x
där x är en siffra från 1-7 (måndag - Söndag).
Men, för att få korrekt veckonummer hjälper antagligen inte det. Dock kan man fråga sig om verkligen SQL Server ska hantera detta åt dig? Kankse det är något som ska ligga i din klient istället. Det kan ju t ex hända att du skriver en sproc som används av klienter med olika lands- och språkinställningar. Då ska ju inte SQL Server bestämma hur veckonumret ska skapas, utan den ska endast leverera ett datum, vilket sedan formatteras till ett veckonummer i klienterna.Sv: SQL-Server och veckonummer
Orsaken till att jag vill ha ut veckonummer i SQL beror på att
jag håller på med ett jobb där jag tar ut statistik ur en (svensk) databas, med bl.a summeringar grupperat per vecka.
Så här har jag löst det hela:
/* */
set datefirst 1
declare @datum datetime,
@days int
select @datum = convert(varchar, year(getdate())) + '-01-01'
select @days = 0
/* leta ratt pa forsta mandagen innevarande ar.*/
while datepart(dw, @datum) <> 1
begin
select @datum = dateadd(dd, 1, @datum)
select @days = (@days + 1)
end
/* hur manga dagar in pa aret ligger mandag? */
if @days > 4
begin
-- om @days ar mindre an 4, backa 7 dgr
select @datum = dateadd(d, -7, @datum)
end
/* rakna antal veckor med @datum som utgangspunkt */
select (datediff(d, @datum, getdate()) / 7) + 1 as 'week'
/* */
MVH // Jonte