Avatar billede nhoff Nybegynder
23. august 2006 - 14:19 Der er 10 kommentarer og
1 løsning

udf der kan returnere start- og slutdato for given uge

Jeg skal venligst spørge om der er nogen der har et forslag til en user defined function, der på baggrund af input (vilkårligt ugenummer og årstal) kan returnere en tekststreng i formatet:

Uge ww, [mandag d. startdato. måned årstal] - [søndag d. slutdato måned årstal]

Dvs. det gælder om at finde start- og slutdato for en given uge. Funktionen skal (helst) være uafhængig af systemindstillinger for SQL-serveren så man kan slippe udenom de amerikanske datoindstillinger.

På forhånd tak!
Avatar billede kjulius Novice
23. august 2006 - 16:00 #1
Jeg kender ikke selv nok til UDF på SQL server til at kunne lave det, men måske kan du (eller en anden) alligevel få inspiration fra en tilsvarende "opgavebesvarelse" til Access:

http://www.eksperten.dk/spm/724982
Avatar billede kjulius Novice
24. august 2006 - 02:58 #2
Jeg har alligevel ikke kunnet dy mig for at prøve. Så efter at have allieret mig med Transact SQL manualen på Microsofts site, er jeg kommet frem til dette:

CREATE FUNCTION dbo.WeekInterval( @week int DEFAULT=0,  @year int DEFAULT=0)
    RETURNS VARCHAR
AS
BEGIN
    DECLARE @workDate Date
    DECLARE @workUge Int
    DECLARE @workÅr Int
    DECLARE @workUgedag Int
    DECLARE @UgeStartDato Date
    DECLARE @UgeSlutDato Date

    -- Set sprog til dansk - det skulle også sikre, at DATENAME returnerer
    -- danske tekster og at DATEPART bruger ugestart iht. ISO standard

    SET LANGUAGE danish

    IF @week = 0
        SET @workUge = DATEPART(wk, GETDATE())
    ELSE
        SET @workUge = @week

    IF @year = 0
        SET @workÅr = DATEPART(yyyy, CURDATE())
    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 DATE)   
    SET @workUgedag = DATEPART(DAYOFWEEK, @workDate)
    IF @workUgedag > 1
        SET workDate = DATEADD(d, 8 - @workUgedag, 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

Da jeg ikke har haft mulighed for at teste det, og jeg ikke tidligere har prøvet at lave sådan en UDF er det temmelig usandsynlig, at den virker.
Men du kan jo prøve den af alligevel... :-)
Avatar billede nhoff Nybegynder
25. august 2006 - 12:09 #3
Tusind tak for indsatsen. Jeg har leget lidt videre med dit glimrende forarbejde og er kommet til nedenstående. Det eneste problem er, at jeg får en fejl når jeg checker syntax. Fejlen lyder:

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

Så det lugter af, at getdate() ikke kan bruges på præcis den måde. Jeg har kigget i hjælp og hér på eksperten, men der findes ikke umiddelbart noget der kan afhjælpe. Har du - eller andre - et godt bud på hvad man gør?

----
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
    -- Set sprog til dansk - det skulle også sikre, at DATENAME returnerer
    -- danske tekster og at DATEPART bruger ugestart iht. ISO standard
SET LANGUAGE danish
Go


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 Slettet bruger
25. august 2006 - 13:56 #4
Af nysgerrighed, var jeg med på en lytter på dette spørgsmål. Som et kuriosum kan jeg så sige, at jeg igår løste rundt regnet samme opgave i PHP.

http://skema.tuxino.dk/ugenummer.php
Avatar billede kjulius Novice
25. august 2006 - 14:37 #5
Tja, jeg ved ikke rigtigt... Du kunne jo forsøge at bruge

SET @DagsDato = CURRENT_TIMESTAMP

i stedet for

SET @dagsdato = GETDATE()

Det lyder bare usandsynligt, at det skulle ændre noget... :-(

I øvrigt har jeg lige fået øje på en fejl i min kode. Der skulle naturligvis have stået:

SET @UgeSlutDato = DATEADD(d, 6, @UgeStartDato)
Avatar billede kjulius Novice
25. august 2006 - 14:45 #6
I øvrigt forstår jeg ikke helt din bevæggrund for at have fjernet den IF sætning, som finder årets første mandag. Det er jo langt fra sikkert, at den 1. januar er en mandag. 1. januar kan jo være sidste del af uge 52 eller 53 fra det foregående år.
Avatar billede nhoff Nybegynder
17. april 2007 - 10:13 #7
kjulius smider du et svar? Tak for hjælpen!
Avatar billede kjulius Novice
17. april 2007 - 19:22 #8
Okay, så lad gå da! :-)

Fik du det i det hele taget til at virke?
Avatar billede nhoff Nybegynder
17. april 2007 - 21:20 #9
Ja, delvis. Jeg har stadig et problem med forkert ugeangivelse i forbindelse med årsskifte. Det bliver dog først et problem ved næste årsskifte. Jeg finder på noget inden da :-)
Avatar billede Slettet bruger
17. april 2007 - 23:33 #10
Dit problem kan måske skyldes lidt de samme problemer vi havde i forbindelse med det lille ugenummer-script, jeg linkede til.

Bemærk at uge 1 er IKKE nødvendigvis den uge med den første mandag i året. Hvis en af 29/12, 30/12 eller 31/12 er en mandag, så starter uge 1 i året før. Og dette er netop tilfældet ved næste årsskifte. Mit program løser det ved at finde første mandag efter 28/12.
Avatar billede kjulius Novice
18. april 2007 - 01:37 #11
Jeg ved ikke om dette vil være til inspiration eller afskrækkelse: ;-)

http://www.tondering.dk/claus/cal/node8.html#SECTION00880000000000000000
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