Tak for input. Jeg har prøvet begge ting og desværre med samme resultat. Jeg tror at det måske har noget meget specifik at gøre med, at jeg bruger det i en function(?)
CREATE FUNCTION dbo.WeekInterval( @week int, @year int) RETURNS VARCHAR AS BEGIN DECLARE @workDate Datetime DECLARE @workUge Int DECLARE @workÅr Int DECLARE @workUgedag Int DECLARE @UgeStartDato Datetime DECLARE @UgeSlutDato Datetime DECLARE @DagsDato datetime
set @DagsDato = GETDATE()
IF @week = 0 SET @workUge = DATEPART(wk, @DagsDato) ELSE SET @workUge = @week
IF @year = 0 SET @workÅr = DATEPART(yyyy, @DagsDato) ELSE SET @workÅr = @year
-- Beregn datoen for den første mandag i året SET @workDate = CAST( '1.1.' + CAST(@workÅr AS VARCHAR) AS DATEtime) SET @workUgedag = DATEPART(dw, @workDate)
-- Beregn start- og slutdato for det angivne ugenummer SET @UgeStartDato = DATEADD(wk, @workUge - DATEPART(wk, @workDate), @workDate) SET @UgeSlutDato = DATEADD(d, 6, @UgeSlutDato)
-- Returner en tekstbeskrivelse af datointervallet det søgte ugenummer repræsenterer
RETURN 'Uge ' + CAST(@workUge AS VARCHAR) + ', ' + CAST(@workÅr AS VARCHAR) + ': ' + DATENAME(dw, @UgeStartDato) + ', den ' + CAST(DAY(@UgeStartDato) AS VARCHAR) + '. ' + DATENAME(mm, @UgeStartDato) + ' ' + CAST(YEAR(@UgeStartDato) AS VARCHAR) +
' til ' +
DATENAME(dw, @UgeSlutDato) + ', den ' + CAST(DAY(@UgeSlutDato) AS VARCHAR) + '. ' + DATENAME(mm, @UgeSlutDato) + ' ' + CAST(YEAR(@UgeSlutDato) AS VARCHAR)
CREATE PROCEDURE dbo.WeekInterval @week int, @year int AS BEGIN DECLARE @workDate Datetime DECLARE @workUge Int DECLARE @workÅr Int DECLARE @workUgedag Int DECLARE @UgeStartDato Datetime DECLARE @UgeSlutDato Datetime DECLARE @DagsDato datetime
set @DagsDato = GETDATE()
IF @week = 0 SET @workUge = DATEPART(wk, @DagsDato) ELSE SET @workUge = @week
IF @year = 0 SET @workÅr = DATEPART(yyyy, @DagsDato) ELSE SET @workÅr = @year
-- Beregn datoen for den første mandag i året SET @workDate = CAST( '1.1.' + CAST(@workÅr AS VARCHAR) AS DATEtime) SET @workUgedag = DATEPART(dw, @workDate)
-- Beregn start- og slutdato for det angivne ugenummer SET @UgeStartDato = DATEADD(wk, @workUge - DATEPART(wk, @workDate), @workDate) SET @UgeSlutDato = DATEADD(d, 6, @UgeSlutDato)
-- Returner en tekstbeskrivelse af datointervallet det søgte ugenummer repræsenterer
RETURN 'Uge ' + CAST(@workUge AS VARCHAR) + ', ' + CAST(@workÅr AS VARCHAR) + ': ' + DATENAME(dw, @UgeStartDato) + ', den ' + CAST(DAY(@UgeStartDato) AS VARCHAR) + '. ' + DATENAME(mm, @UgeStartDato) + ' ' + CAST(YEAR(@UgeStartDato) AS VARCHAR) +
' til ' +
DATENAME(dw, @UgeSlutDato) + ', den ' + CAST(DAY(@UgeSlutDato) AS VARCHAR) + '. ' + DATENAME(mm, @UgeSlutDato) + ' ' + CAST(YEAR(@UgeSlutDato) AS VARCHAR)
Husk at bruge ISOweek og ikke den indbyggede DatePart-Week, den giver laver ikke korrekt ugeskifte ved årsskifte uge 52-uge 53 - prøv evt. selv at eksperimentere lidt.
Til beregning af den korrekte uge ved årsskifte anvend: (snippet fra BOL)
ISO week In this example, a user-defined function, ISOweek, takes a date argument and calculates the ISO week number. For this function to calculate properly, SET DATEFIRST 1 must be invoked before the function is called.
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
Here is the function call. Notice that DATEFIRST is set to 1.
SET DATEFIRST 1 SELECT master.dbo.ISOweek('12/26/1999') AS 'ISO Week'
Derudover kan du ikke bruge nedenstående built-in functions i dine egne funktioner. Det hænger sammen med du kun kan bygge en function bestående af deterministic function, hvilket vil sige at de er stabile hvergang du kalder dem.
Nedenstående er nondeterministiske og kan derfor ikke anvendes! Built-in functions that can return different data on each call are not allowed in user-defined functions. The built-in functions not allowed in user-defined functions are:
Jeg vil anbefale dig, nu når du er så godt igang, blot at udvide din funktion til: dbo.WeekInterval(fldWeek, fldYear, getdate()) Det overlever du nok :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.