Avatar billede nhoff Nybegynder
25. august 2006 - 12:55 Der er 12 kommentarer og
1 løsning

Fejl med getdate?

Jeg får en fejl ifm. brug af getdate(), f.eks. ved følgende:

.
.
.
SET @workUge = DATEPART(wk, getdate())
.
.
.

Fejl lyder:

Error 443: Invalid use of 'getdate' within a function

Hvorfor? Og hvad kan jeg gøre for at komme rundt om det?
Avatar billede the_party_dog Nybegynder
25. august 2006 - 12:57 #1
Smid din GETDATE() over i en variable, så er det løst..

DECLARE @DateNow DATETIME
SET @DateNow = GETDATE()

SET @workUge = DATEPART(wk, @DateNow)
Avatar billede dr_chaos Nybegynder
25. august 2006 - 12:57 #2
lav et view som returnerer
SELECT getdate()
Avatar billede nhoff Nybegynder
25. august 2006 - 13:13 #3
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(?)
Avatar billede the_party_dog Nybegynder
25. august 2006 - 13:15 #4
Det lyder altså som om der er andet galt... Dette her virker 110% ved mig...

DECLARE @workUge INT
DECLARE @DateNow DATETIME

SET @DateNow = GETDATE()
SET @workUge = DATEPART(wk, @DateNow)

SELECT @workUge
Avatar billede the_party_dog Nybegynder
25. august 2006 - 13:19 #5
Ahhh..... Nu fattede jeg hvad du mente med function :)

Kan du ikke bare lave en Stored Procedure? Så kalde den, når du skal bruge uge tallet?
Avatar billede dr_chaos Nybegynder
25. august 2006 - 13:20 #6
Du bør også kunne lave et view som gør det hele for dig:
create view view1

SELECT DATEPART(wk, getdate()) as workUge

Men ellers kan du lave en SP.
Avatar billede nhoff Nybegynder
25. august 2006 - 13:22 #7
Hele min 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)   

END
Avatar billede dr_chaos Nybegynder
25. august 2006 - 13:27 #8
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)

END
Avatar billede dr_chaos Nybegynder
25. august 2006 - 13:32 #9
DECLARE @str varchar(8000)
SET @str = EXEC dbo.WeekInterval 34,2006
Avatar billede nhoff Nybegynder
25. august 2006 - 13:35 #10
Tak. Er ikke helt med på hvordan jeg bruger det i f.eks. et view. Det er netop meningen, at jeg skal køre et view, der hedder

SELECT fldWeek as Uge, fldYear as År, dbo.WeekInterval(fldWeek, fldYear) as Startdato FROM ....

Hvordan gør jeg det med ovenstående? Den returnerer jo ikke noget(?)
Avatar billede janus_007 Nybegynder
26. august 2006 - 00:46 #11
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:

@@CONNECTIONS @@PACK_SENT GETDATE
@@CPU_BUSY @@PACKET_ERRORS GetUTCDate
@@IDLE @@TIMETICKS NEWID
@@IO_BUSY @@TOTAL_ERRORS RAND
@@MAX_CONNECTIONS @@TOTAL_READ TEXTPTR
@@PACK_RECEIVED @@TOTAL_WRITE


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 :-)
Avatar billede nhoff Nybegynder
17. april 2007 - 10:13 #12
Måske vi skulle få lukket dette spørgsmål? :-) Tak for svarene til jer begge. Den der svarer først får point
Avatar billede dr_chaos Nybegynder
23. april 2007 - 15:09 #13
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester