Berekening van verschil tussen 2 datums en tijden

Status
Niet open voor verdere reacties.

novita

Gebruiker
Lid geworden
25 dec 2014
Berichten
19
Hallo Forum leden
Ik heb een vraag betreft een stuk vba voor acces
Ik ben vrij recent gestart met het programma acces en wat dingen in het elkaar aan het sleutelen.
Nu loop ik tegen een probleem op waar ik al geruime tijd naar aan een oplossing aan het zoeken ben hiervoor.
Aangezien ik weinig kennis heb met vba wil ik vragen of jullie mij met dit probleem zouden kunnen helpen.
Op internet heb ik een aantal scripts gevonden welk mischien het probleem kan oplossen maar dit weet ik niet of dit te koppelen is of dat er een anderscript gemaakt kan worden met wat uitleg hiervan zodat ik het zou kunnen analyseren om hier ook wat van te kunnen leren.

Het gaat hierom.
Ik heb 2 tabellen gemaakt een tabel (jaar) met een veld jaar
en een tabel (invoer) met velden datum start,tijd start,datum stop,en tijd stop.

Nu zou ik graag in een query een berekening willen hebben welk het verschil bereken tussen (datum start,tijd start) en (datum stop,tijd stop) in minuten waarbij rekening wordt gehouden met zaterdag en zondag en feestdagen niet meegerekend als deze in de periode valt van de (datum start,tijd start) en(datum stop,tijd stop)

hierbij de script welk ik gevonden heb op internet.

Code:
Public Function ElapsedMinutes(Datum_Start_Productie As Date, Tijd_Start_Productie As Date, Datum_Stop_Productie As Date, Tijd_Stop_Productie As Date) As String
On Error GoTo Err_ElapsedMinutes
    Dim start As Date
    Dim eind As Date
    Dim intRetValMinutes As Long
    
   start = Datum_Start_Productie + Tijd_Start_Productie
    eind = Datum_Stop_Productie + Tijd_Stop_Productie
    
    If Not IsNull(eind) Then
        If start < eind Then
            intRetValMinutes = DateDiff("n", start, eind)
        Else
            intRetValMinutes = DateDiff("n", start, eind - 1)
        End If
    Else
        intRetValMinutes = 0
    End If
    
    ElapsedMinutes = intRetValMinutes
    
Exit_ElapsedMinutes:
    Exit Function
    
Err_ElapsedMinutes:
    MsgBox Err.Number & ": " & Err.Description
    Resume Exit_ElapsedMinutes
End Function


Function Pasen(Jaar As Integer) As Date
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte

A = Jaar Mod 19
B = Int(Jaar / 100)
C = Int((3 * B - 5) / 4)
D = (Int(12 + 11 * A + (8 * B + 13) / 25 - C) Mod 30 + 30) Mod 30

If 11 * D < A + 1 Then
    E = 56 - D
Else
    E = 57 - D
End If

Pasen = DateValue("01/03/" & Str(Jaar)) + E - 1 - Int(E + (5 * Jaar) / 4 - C) Mod 7

End Function

Function PlusWerkdagen(Van As Date, Werkdagen As Integer) As Date
Dim Tel As Integer
Dim Datum As Date

Datum = Van
Tel = Werkdagen

Do While Tel <> 0
    Datum = DateAdd("d", 1, Datum)
    If Not IsZZfVdag(Datum) Then
        Tel = Tel - 1
    End If
Loop
PlusWerkdagen = Datum
End Function

Function AantalWerkdagen(Van As Date, Tot As Date) As Integer
Dim Tel As Integer
Dim Datum As Date

Tel = 0
Datum = Van

Do While Datum <= Tot
    If Not IsZZfVdag(Datum) Then
        Tel = Tel + 1
    End If
    Datum = DateAdd("d", 1, Datum)
Loop

AantalWerkdagen = Tel
End Function

Function IsZZfVdag(ElapsedMinutes As Date) As Boolean
Dim Jaar As Integer
Dim TDag As String
Dim Pa1 As Date
Dim hDat As Date

IsZZfVdag = False

'Controleren of de datum een zaterdag of een zondag is
If DatePart("w", Datum) = 1 Or _
   DatePart("w", Datum) = 7 Then
    IsZZfVdag = True
    GoTo Einde
End If

'Controleren op feestdagen met een vaste datum
TDag = Format(Datum, "dd-mm")

If TDag = "01-01" Then
    IsZZfVdag = True
    GoTo Einde
End If

If TDag = "30-04" Then
    IsZZfVdag = True
    GoTo Einde
End If

If TDag = "05-05" Then
    IsZZfVdag = True
    GoTo Einde
End If

If TDag = "25-12" Then
    IsZZfVdag = True
    GoTo Einde
End If

If TDag = "26-12" Then
    IsZZfVdag = True
    GoTo Einde
End If

'Bepalen eerste paasdag
Jaar = DatePart("yyyy", Datum)
Pa1 = Pasen(Jaar)

'Controle goede vrijdag
If (Datum = Pa1 - 2) Then
    IsZZfVdag = True
    GoTo Einde
End If

'Controle tweede paasdag
If (Datum = Pa1 + 1) Then
    IsZZfVdag = True
    GoTo Einde
End If

'Controle hemelvaartdag
If (Datum = Pa1 + 39) Then
    IsZZfVdag = True
    GoTo Einde
End If

'Controle tweede pinksterdag
If (Datum = Pa1 + 50) Then
    IsZZfVdag = True
    GoTo Einde
End If

'Controleren op vakantie dagen
hDat = Format(Datum, "mm-dd-yyyy")
If Not IsNull(DLookup("VAN", "Vakantie", "VAN<=#" & hDat & "# AND TEM>=#" & hDat & "#")) Then
    IsZZfVdag = True
    GoTo Einde
End If

Einde:
End Function




Bij voorbaat dank

Groet Novita
 
Laatst bewerkt:
Allereerst nog welkom bij HelpMij! Dit is je eerste bericht zie ik, dus je weet wellicht de regels nog niet. Maar op deze manier is code onleesbaar, dus zou je eerst de code netjes willen opmaken met de CODE knop? Dat kun je doen in het venster <Ga geavanceerd> en dan de code (liefst ingesprongen, dus ik denk dat je de oude code moet verwijderen en opnieuw plakken) selecteren en opmaken met de knop ( # ).
Hier krijg je een muisarm van, en dat zal je bedoeling toch ook niet zijn :)
 
hoe bepaal ik een juiste leefttijd

beste,

ik verjaar 08/04/1985

ik wil in een query berekenen de juiste leeftijd bv vandaag, en volgend jaar moet er automatisch een jaar bijkomen.
Hoe doe ik dit in access2013?
met vriendelijke groeten
Marc
 
Hallo marcjaco,

je stelt een vraag in een topic van iemand anders, en dat mag eigenlijk niet. Volgens mij had je dat zelf ook al door, want je hebt een eigen vraag gemaakt, en daar zet ik je antwoord dus verder in!
 
Ik ben de oorspronkelijke vraag een beetje uit het oog verloren :o. Maar we pakken 'm weer op :thumb:. Kun je een voorbeeldje maken met data, zodat we wat beter kunnen meekijken.
 
Bekijk bijlage Databasetooling.rar

In de database zit een tabel Tooling waarin datum en tijd van de start productie wordt ingevoerd en de datum en tijd van stop productie.
nu is hiervan een query gemaakt (tooling Query) waarin door middel van module verstreken tijd tussen datum in minuten het aantal minuten wordt uitgerekend welk tussen de start en eind productie wordt berekend.

nu is de vraag of het mogelijk is om als tussen de periode van start en eind productie een weekend (zaterdag en zondag) valt deze tijd in minuten dan af te trekken van de tijd welk dan is gegenereerd in de (tooling Query) verstreken tijd tussen datum in minuten.

er zit een gevonden op internet berekening werkdagen bij met module1 waarin gekeken wordt naar feestdagen en zaterdag en zondagen wat misschien sommige delen gebruikt kan worden om het uiteindelijke resultaat te krijgen, productie tijd berekenen tussen datums zonder zatedag, zondag, feestdagen, vakantietijd.

Groet Novita :)
 
De functie moet dan heel anders werken, want je moet door de verschillende datums lussen, en vervolgens kijken of een dag in het weekend valt, of op een feestdag. Maar dat is wel te doen.
 
Ben benieuwd hoe zo iets er dan uit ziet , Ben wel een leek op dit gebied.

Novita,
 
Zal er vanavond even naar kijken; ik heb jouw voorbeeld al wat bewerkt, en daar kan ik nu niet bij.
 
Hallo Michel,
Als ik het Foum bekijk zie ik dat je hiermee ontzettend druk bent, :thumb: maar ik zou toch willen vragen of je nog wel aan mijn probleem denkt en je misschien in de zoveel draadjes van het Forum het overzicht kwijt raakt.
Ik zit echt vast op dit probleem en zou graag verder willen:D
Als je me hiebij kan helpen ben ik je zeer dankbaar.

Groeten Novita
 
Ik kan niet zeggen dat je geen geduld hebt :). Bij deze!
 

Bijlagen

Hallo Michel,
Mijn Dank is groot ga hiermee aan de slag en ga proberen te begrijpen hoe dit is opgebouwd.
:thumb:

Groeten, Novita
 
De truc die ik heb toegepast is eigenlijk heel simpel. De DateDiff formule heeft 2 datums nodig, maar weet uiteraard niet of een datum in een weekend of op een feestdag valt. Dus wat ik doe, is de startdatum ophogen met het aantal dagen dat in de tussenliggende dagen in die categorie valt. Dat gebeurt in een lus die de variabele iVerschil steeds ophoogt. Dus als de startdatum 8 januari is, en de einddatum 15 januari, dan zit daar 1 weekend = 2 dagen tussen. De nieuwe startdatum wordt dan 8+2=10 januari. En dan maak je de berekening verder op de gekende manier af.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan