23. august 2006 - 14:19Der 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.
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
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:
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... :-)
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
Synes godt om
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.
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.
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 :-)
Synes godt om
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.
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.