Avatar billede hmortensen Nybegynder
01. april 2004 - 09:22 Der er 22 kommentarer og
3 løsninger

Antal dage uden weekend

Hej

Jeg har en tabel med en start og en slut dato.

Jeg skal nu tælle hvor mange dage der er mellem de 2 datoer.
Det gør jeg således:

SELECT (slut-start)+1 AS antal FROM dato;
Og det virker fint, men den skal ikke tælle lørdag/søndag med. Kan det klares i et udtræk ?
Har kigget lidt på datediff, men kan ikke rigtig finde noget brugbart.
01. april 2004 - 09:30 #1
Hvad med helligdage?
Avatar billede hmortensen Nybegynder
01. april 2004 - 09:31 #2
Hvis det kan lade sig gøre skal den også springe dem over
01. april 2004 - 09:35 #3
Læg følgende 2 funktioner i et modul:

Public Function Arbejdsdag(Dato As Date) As Boolean
    If Weekday(Dato) = 7 Or Weekday(Dato) = 1 Then
        Arbejdsdag = False
    Else
        Arbejdsdag = True
    End If
End Function

Public Function FindAntalArbejdsdage(Startdato As Date, Slutdato As Date) As Long
    Dim tmpDato As Date
    Dim n As Integer
    tmpDato = Startdato
    Do Until tmpDato >= Slutdato
        If Arbejdsdag(tmpDato) Then
            n = n + 1
        End If
        tmpDato = tmpDato + 1
    Loop
    FindAntalArbejdsdage = n
End Function

Herefter kan du bruge FindAntalArbejdsdage(Startdato, Slutdato) til at finde antallet (uden helligdage)
Avatar billede jensen363 Forsker
01. april 2004 - 09:35 #4
SELECT Count(Tabel1.Dato) AS AntalOfDato, Format([Dato],"ddd") AS Ugedag
FROM Tabel1
GROUP BY Format([Dato],"ddd")
HAVING (((Format([Dato],"ddd")) Not In ("lø","sø")));
01. april 2004 - 09:38 #5
Hvis du vil tage hensyn til helligdage, skal du oprette en tabel, med én kolonne, som hedder "Dato". Tabellen kaldes "Helligdage".

Herefter udskifter du funktionen Arbejdsdag med denne:

Public Function Arbejdsdag(Dato As Date) As Boolean
    If Weekday(Dato) = 7 Or Weekday(Dato) = 1 Then
        Arbejdsdag = False
    ElseIf DCount("*", "Helligdage", "Dato = #" & Format(Dato, "yyyy-mm-dd") & "#") > 0 Then
        Arbejdsdag = False
    Else
        Arbejdsdag = True
    End If
End Function
Avatar billede jensen363 Forsker
01. april 2004 - 09:40 #6
Hvis du vil have totalsum, fjerner du linien GROUP BY
01. april 2004 - 09:43 #7
jensen->virker det? Smart :o)

Den er måske ikke lige sådan at få ind i en eksisterende query.
Avatar billede hmortensen Nybegynder
01. april 2004 - 09:47 #8
Jensen, hvordan sætter jeg min start og slut dato ind i dit forslag ?

Thomas, skal alle helligdage så indskrives i helligdags tabellen ?
Avatar billede jensen363 Forsker
01. april 2004 - 09:48 #9
Som Thomas skriver, skal du have en ekstra tabel hvor du angiver helligdagene, og så kan forespørgslen se således ud :

SELECT Count(Tabel1.Dato) AS AntalOfDato
FROM Tabel1 LEFT JOIN Helligdage ON Tabel1.Dato = Helligdage.HDato
WHERE (((Helligdage.HDato) Is Null) AND ((Format([Dato],"ddd")) Not In ("lø","sø")));
Avatar billede hmortensen Nybegynder
01. april 2004 - 09:49 #10
Jensen, din forespørgelse, vælger da kun et felt ?
Avatar billede jensen363 Forsker
01. april 2004 - 09:57 #11
SELECT Count(Tabel1.Dato) AS DatoAntal
FROM Tabel1 LEFT JOIN Helligdage ON Tabel1.Dato = Helligdage.HDato
WHERE (((Tabel1.Dato) Between [StartDato:] And [SlutDato:])
AND ((Helligdage.HDato) Is Null)
AND ((Format([Dato],"ddd")) Not In ("lø","sø")));
Avatar billede hmortensen Nybegynder
01. april 2004 - 10:02 #12
Vælger du ikke 3 felter nu ?
dato, startdato,slutdato ?
Avatar billede jensen363 Forsker
01. april 2004 - 10:04 #13
Det er een og samme tabel/felt som der henvises til. Between [StartDato:] And [SlutDato:]) er to variabler som aktiveres når forespørgslen genereres, dvs. du skal så indtaste dato-intervallet som der skal søges på ;)
Avatar billede hmortensen Nybegynder
01. april 2004 - 10:12 #14
Jeg blir bedt om at indtaste:
Dato
StartDato
SlutDato
Dato

Den skal kun ha start og slut indput, og så fortælle antal dage
Avatar billede jensen363 Forsker
01. april 2004 - 10:20 #15
Hvilke elementer indeholder dine to tabeller ( tabelnavn og feltnavne )
Avatar billede terry Ekspert
01. april 2004 - 10:23 #16
Place Thomas's functions in a module, then alter your query as follows.

SELECT FindAntalArbejdsdage([start],[slut]) AS Antal FROM Dato
Avatar billede hmortensen Nybegynder
01. april 2004 - 10:35 #17
Terry, vil helst ha en ren query, uden modul.

jensen, har en tabel dato:
id - auto
start - datoformat
slut - datoformat

helligdage:
id - auto
Hdato - datoformat
navn - text
Avatar billede jensen363 Forsker
01. april 2004 - 10:48 #18
ups .... jeg har vis misforstået opgaven en anelse ;) ... jeg gik ud fra, at start og slut blev valgt fra en tabel med alle datoer ...

Så er der nok kun et modul-metoden ... sorry ...
Avatar billede hmortensen Nybegynder
01. april 2004 - 11:18 #19
Rettede lidt til i modulet, og fik det til at virke perfekt med helligdage.

Mange tak for hjælpen
Avatar billede terry Ekspert
01. april 2004 - 11:59 #20
hindu... OK, but then why reject my answer and not others? and I very much doubt that you can do it in pure SQL! You MUST use some functions to find days which are saturday and sunday!
Avatar billede hmortensen Nybegynder
01. april 2004 - 12:01 #21
Jeg kunne kun fordele point lige mellem jer.
Avatar billede nih Novice
01. april 2004 - 12:39 #22
Avatar billede hmortensen Nybegynder
01. april 2004 - 12:47 #23
Hvordan kalder jeg den ?
Avatar billede nih Novice
01. april 2004 - 13:09 #24
Du opretter et nyt modul og copy paster det hele ind i modulet.

brug functionen IsHelligdag

select dato, IsHelligdag(dato) as Erhelligdag
from dato
Avatar billede mbpedersen Nybegynder
11. oktober 2008 - 21:51 #25
Hej Niels

Forsøgte at følge linket, men desværre... Har du stadig koden, og vil du evt. gøre den tilgængelig eller E-maile den til mig?
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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