Avatar billede stalle Nybegynder
22. juli 2010 - 10:04 Der er 1 kommentar og
1 løsning

Tilføje alle hverdage for måned til tabel

Hej Alle sammen,

Jeg har nu siddet i noget tid, for forsøgt mig med og finde en måde, hvorpå jeg kan tilføje en record til en tabel, indeholdende datoen for alle hverdage i en måned.

Jeg har i skrivende stund følgende:

ALTER function [dbo].[generateDateTable]

  -- Add the parameters for the function here
  @start_date datetime
  , @end_date datetime
  , @datepart varchar(20) = 'day'
  , @step int = 1
)
returns table
as
return (
  with getdates (dateoer)
    as (

  select
    @start_date as date

  union all

  select
    case
      when @datepart in ('year', 'yy', 'yyyy') then dateadd(yy, @step, dateoer)
      when @datepart in ('quarter', 'qq', 'q') then dateadd(qq, @step, dateoer)
      when @datepart in ('month', 'mm', 'm') then dateadd(mm, @step, dateoer)
      when @datepart in ('dayofyear', 'dy', 'y') then dateadd(dy, @step, dateoer)
      when @datepart in ('day', 'dd', 'd') then dateadd(dd, @step, dateoer)
      when @datepart in ('week', 'wk', 'ww') then dateadd(ww, @step, dateoer)
      when @datepart in ('hour', 'hh') then dateadd(hh, @step, dateoer)
      when @datepart in ('minute', 'mi', 'n') then dateadd(n, @step, dateoer)
      when @datepart in ('second', 'ss', 's') then dateadd(s, @step, dateoer)
      when @datepart in ('millisecond', 'ms') then dateadd(ms, @step, dateoer)
      else dateadd(dd, @step, dateoer)
    end as date
  from
    getdates
  where
    (case
      when @datepart in ('year', 'yy', 'yyyy') then dateadd(yy, @step, dateoer)
      when @datepart in ('quarter', 'qq', 'q') then dateadd(qq, @step, dateoer)
      when @datepart in ('month', 'mm', 'm') then dateadd(mm, @step, dateoer)
      when @datepart in ('dayofyear', 'dy', 'y') then dateadd(dy, @step, dateoer)
      when @datepart in ('day', 'dd', 'd') then dateadd(dd, @step, dateoer)
      when @datepart in ('week', 'wk', 'ww') then dateadd(ww, @step, dateoer)
      when @datepart in ('hour', 'hh') then dateadd(hh, @step, dateoer)
      when @datepart in ('minute', 'mi', 'n') then dateadd(n, @step, dateoer)
      when @datepart in ('second', 'ss', 's') then dateadd(s, @step, dateoer)
      when @datepart in ('millisecond', 'ms') then dateadd(ms, @step, dateoer)
      else dateadd(dd, @step, dateoer)
    end) <= @end_date
  )

  select
    dateoer
  from
    getdates
)


Ovenstående virker nu også ganske fortrindeligt, med den undtagelse at den tilføjer ALLE datoer. Altså også for de lørdage og søndage, der måtte være indenfor de datoer jeg angiver.

Har forsøgt mig med og tjekke på dagene, hvorvidt der er tale om en lørdag eller søndag, men desværre uden held.

Der skulle vel ikke være en venlig sjæl der kan gennemskue hvordan jeg kan gribe det an ?

Skulle der være nogen spørgsmål, svarer jeg gerne på dem.

Mvh
Torben
Avatar billede stalle Nybegynder
22. juli 2010 - 11:27 #1
Så lykkedes det vist.

Til den nysgerrige læser, er det oprindelige blevet justeret en del.
Nu tilføjes datoer for lørdag og søndag ikke længere.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

alter function generateDateTable
(
    -- Add the parameters for the function here
    @start_date datetime
    , @end_date datetime
    , @datepart varchar(20) = 'day'
    , @step int = 1
    , @empID int
)
returns @dates table
(
    -- Add the column definitions for the TABLE variable here
    oprettet datetime
    ,antal int
    ,medarbejder_id int
    ,produkter_id int
    ,status_id int
)
as
begin
    -- if we're doing calculations based on the days (not time) then strip the time out
    if( @datepart in ('year', 'yy', 'yyyy', 'quarter', 'qq', 'q', 'month', 'mm', 'm', 'dayofyear', 'dy', 'y', 'day', 'dd', 'd', 'week', 'wk', 'ww') )
    begin
        set @start_date = cast(floor(cast(@start_date as float)) as datetime)
        set @end_date = cast(floor(cast(@end_date as float)) as datetime)
    end

    declare @new_start datetime

   
   
    while @start_date <= @end_date
    BEGIN
        -- get the new starting row
        set @new_start = (case
            when @datepart in ('year', 'yy', 'yyyy') then dateadd(yy, @step, @start_date)
            when @datepart in ('quarter', 'qq', 'q') then dateadd(qq, @step, @start_date)
            when @datepart in ('month', 'mm', 'm') then dateadd(mm, @step, @start_date)
            when @datepart in ('dayofyear', 'dy', 'y') then dateadd(dy, @step, @start_date)
            when @datepart in ('day', 'dd', 'd') then dateadd(dd, @step, @start_date)
            when @datepart in ('week', 'wk', 'ww') then dateadd(ww, @step, @start_date)
            when @datepart in ('hour', 'hh') then dateadd(hh, @step, @start_date)
            when @datepart in ('minute', 'mi', 'n') then dateadd(n, @step, @start_date)
            when @datepart in ('second', 'ss', 's') then dateadd(s, @step, @start_date)
            when @datepart in ('millisecond', 'ms') then dateadd(ms, @step, @start_date)
            else dateadd(dd, @step, @start_date)
        end)

    if(( DATENAME(w,@start_date) != 'Saturday') AND (DATENAME(w,@start_date) != 'Sunday'))
    BEGIN
        -- insert a new row
        insert
            @dates
        (
            oprettet
            ,antal
            ,medarbejder_id
            ,produkter_id
            ,status_id
        ) values (
            @start_date
            ,1
            ,@empID
            ,1
            ,1
        )
    END
        -- update the starting row
        set @start_date = @new_start
    END
   
    return
end
GO


Kommentarer til løsningen modtages gerne.
Avatar billede stalle Nybegynder
01. november 2010 - 12:34 #2
Kan da ligeså godt få lukket af her
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

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