[Access 2003] Weekdays in DateDiff functie

Pagina: 1
Acties:
  • 120 views sinds 30-01-2008
  • Reageer

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik probeer in Access een view te maken die aangeeft hoeveel werkdagen iets open staat. Ik gebruik hiervoor de formule:

code:
1
DateDiff("w", <logdate>, NOW())


Maar dit werkt voor geen meter. Als de logdate ouder is dan 26-8-2004 dan is de waarde 1 alles jonger is gewoon 0.

Ik dacht dat de weekday interval juist de weekenden ontweek maar dat is dus niet het geval. Is er met een standaard functie hier iets aan te doen?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
When interval is Weekday ("w"), DateDiff returns the number of weeks between the two dates. If date1 falls on a Monday, DateDiff counts the number of Mondays until date2. It counts date2 but not date1.
Hmmm.... Zou toch moeten werken? Of begrijp ik je verkeerd?

@P_de_B: :w
Jij hebt het over de Weekday functie...

[ Voor 31% gewijzigd door RobIII op 02-09-2004 11:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Er is geen standaard werkdagen formule voor Access maar de eerste hit op google geeft: http://www.tek-tips.com/faqs.cfm?pid=181&fid=261

@Rob: heb ik net ge-edit ga jij mij nog verbeteren ;)

[ Voor 48% gewijzigd door P_de_B op 02-09-2004 11:59 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je het aantal werkdagen wil hebben kun je toch dit doen:

• Bereken het aantal dagen dat er tussen date1 en date2 zit.
• Tel daar het aantal weken tussen date1 en date2 * 2 (=weekends) van af

...of iets in die richting... :Y)


Lijkt mij 't snelst... Niet rekening houdende met vakanties e.d. dan.

/edit/

Heb 'm effe geprobeerd:
Visual Basic:
1
2
3
Public Function WorkDays(ByVal date1 As Date, ByVal date2 As Date) As Long
    WorkDays = DateDiff("d", date1, date2) - (DateDiff("ww", date1, date2) * 2)
End Function


Zolang je er geen weekends in stopt werkt 'ie prima :X

[ Voor 65% gewijzigd door RobIII op 02-09-2004 12:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ok, thanks!

Ik ben alleen niet zo'n VBA koning. Hoe zorg ik ervoor dat ik een functie vanuit SQL kan aanroepen. Ik heb nu een functie aangemaakt maar SQL zegt hem niet te herkennen!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Deddiekoel schreef op 02 september 2004 @ 12:30:
Ok, thanks!

Ik ben alleen niet zo'n VBA koning. Hoe zorg ik ervoor dat ik een functie vanuit SQL kan aanroepen. Ik heb nu een functie aangemaakt maar SQL zegt hem niet te herkennen!
Ik doe nooit geen ene r*k met Access, dus daar kan ik je helaas dan weer niet mee verder helpen :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Boss
  • Registratie: September 1999
  • Laatst online: 23:23

Boss

+1 Overgewaardeerd

IS het een functie (Function) en staat hij gewoon in een module?

Dan zou 't moeten werken hoor...

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Boss schreef op 02 september 2004 @ 12:34:
IS het een functie (Function) en staat hij gewoon in een module?

Dan zou 't moeten werken hoor...
ow, wacht...maak er eens een Public Function i.p.v. een Private Function van? :X
Werkt het dan wel? O-)

[ Voor 18% gewijzigd door RobIII op 02-09-2004 12:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Hij werkt inmiddels. Ik had in de verwijzing de modulenaam ervoor gezet!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
en feestdagen enzo?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik ben nu bezig met een functie van MS zelf, andere functies boden me niet wat ik wilde.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Option Explicit
                
Function Work_Days(BegDate As Variant, EndDate As Variant) As Variant

   ' Note that this function does not account for holidays.

   Dim WholeWeeks As Variant
   Dim DateCnt As Variant
   Dim EndDays As Integer
         
   On Error GoTo Err_Work_Days

   BegDate = DateValue(BegDate)
   EndDate = DateValue(EndDate)
   WholeWeeks = DateDiff("w", BegDate, EndDate)
   DateCnt = DateAdd("ww", WholeWeeks, BegDate)
   EndDays = 0
   Do While CLng(DateCnt) <= CLng(EndDate)
      If Format(DateCnt, "ddd") <> "Sun" And _
        Format(DateCnt, "ddd") <> "Sat" Then
         EndDays = EndDays + 1
      End If
        DateCnt = DateAdd("h", 24, DateCnt)

   Loop
   'Work_Days = WholeWeeks * 5 + EndDays
   Work_Days = DateCnt

    Exit Function

Err_Work_Days:

    ' If either BegDate or EndDate is Null, return a zero
    ' to indicate that no workdays passed between the two dates. '

    If Err.Number = 94 Then
                Work_Days = 0
    Exit Function
    Else
' If some other error occurs, provide a message.
    MsgBox "Error " & Err.Number & ": " & Err.Description
    End If

End Function

Deze werkt op zich prima alleen is er een ding dat me niet bevalt. Ik zou graag de verschillen tussen de data op het uur nauwkeurig hebben. Maar in bovenstaande functie gaat de tijd informatie verloren. Hoe kan ik deze functie zo nauwkeurig maken?

Edit: De invoer gegevens hebben beide tijd informatie!

[ Voor 9% gewijzigd door Deddiekoel op 02-09-2004 16:15 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hey, open je eigen topic :Y)

Je zou de feestdagen in een Array kunnen gooien, dan voordat je de werkdagen uittelt effe door die array lussen en kijken of die feestdagen in het bereik liggen. Zo ja, dan hoog je een tellertje op en die trek je uiteindelijk af van het totaal :Y)

Dan kom je wel weer tegen andere problemen aan, zoals feestdagen die soms wel in weekends vallen en dan weer niet enzo... (kan er overigens zo snel geen bedenken :? )

Ikzelf hou overigens nooit rekening met deze onzin. Want je hebt lui die tellen de ene feestdag wel, en anderen weer niet. "Werkdagen" houdt bij mij gewoon altijd ma-vr in, f*ck the holidays :+
Deddiekoel schreef op 02 september 2004 @ 16:14:
Ik ben nu bezig met een functie van MS zelf, andere functies boden me niet wat ik wilde.
<knip>
Deze werkt op zich prima alleen is er een ding dat me niet bevalt. Ik zou graag de verschillen tussen de data op het uur nauwkeurig hebben. Maar in bovenstaande functie gaat de tijd informatie verloren. Hoe kan ik deze functie zo nauwkeurig maken?

Edit: De invoer gegevens hebben beide tijd informatie!
Als het je niet bevalt pas je het maar aan. De laatste keer dat ik de P&W FAQ las stond er toch echt iets in in de trend van "zélf programmeren". We gaan je hier echt niet alles voorkauwen. Je kent nu de DateDiff, DateAdd enz. functies, en daarmee moet je een heel eind kunnen komen.

En dan krijg je overigens meteen nog een vraag van me mee: Werkuren of "hele dagen uren"? Suc6! :Y)

En nog een laatste opmerking: Wat een ranzige code van MS :X Ik heb helemaal niks tegen MS, en kijk meestal tegen ze op... Maar dat dit van hun vandaan komt :? Daar sta ik echt wel effe van te kijken!
code:
1
If Format(DateCnt, "ddd") <> "Sun" And Format(DateCnt, "ddd") <> "Sat" Then...


Daar heb je toch de WeekDay functie voor? Dit gaat dus mega fout op systemen met een andere taal dan EN. Verder zie ik dat ze een CLNG van een datum pakken, en hoewel dat best zal werken is dat IMO ook behoorlijk ranzig. En dan heb ik het nog niet gehad over het feit dat deze functie, dankzij de loop die erin zit, sneller/langzamer is naar gelang het verschil tussen de 2 datums. Reken voor de gein eens het vershil uit tussen 1/1/1920 en 1/1/2350 :X Toch niet...
En waarom geeft die functie een Variant terug (en accepteert 2 variant parameters), en niet een Long (aantal dagen) of desnoods een Date ofzo? Access kent toch zeker wel een Long of Date data type?
Enniewee, ik vind het een enorm blok overbodige code. Dan vind ik mijn one-liner (hoewel weekends er +/- 1 dag ernaast zitten) toch echt wel mooier/efficiënter/sneller.

Daarmee wil ik verder trouwens niet zeggen dat we dit topic maar moeten laten verzanden in compleet offtopic gezever over hoe ranzig dit stukje MS broddelwerk wel/niet is. Nogmaals: Niks tegen MS, het verbaast me alleen dat dit van hun zelf af komt.

[ Voor 117% gewijzigd door RobIII op 02-09-2004 16:37 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik snap wat de functie doet en ik heb DateAdd("d", 1, DateCnt) in DateAdd("h", 24, DateCnt) verandert. Maar ergens gaat de tijdinformatie verloren en ik snap niet waar...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
RobIII schreef op 02 september 2004 @ 16:16:
[...]

Hey, open je eigen topic :Y)
nou, ik gaf alleen aan waar ik tegenaan gelopen ben toen ik een soortgelijke functie voor Crystal Reports heb gemaakt :'( :(

:>

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik ben eruit!

Ik heb die DateValue dingen weggegooid en een controle erin gezet die kijkt of het restant minder is dan 24 uur.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Function Work_Days(BegDate As Variant, EndDate As Variant) As Variant

   ' Note that this function does not account for holidays.

   Dim WholeWeeks As Variant
   Dim DateCnt As Variant
   Dim EndDays As Integer
         
   On Error GoTo Err_Work_Days

   'BegDate = DateValue(BegDate)
   'EndDate = DateValue(EndDate)
   WholeWeeks = DateDiff("w", BegDate, EndDate)
   DateCnt = DateAdd("ww", WholeWeeks, BegDate)
   EndDays = 0
   Do While DateCnt <= EndDate
      If Format(DateCnt, "ddd") <> "Sun" And _
        Format(DateCnt, "ddd") <> "Sat" Then
         EndDays = EndDays + 1
      End If
      If DateDiff("h", DateCnt, EndDate) < 24 Then
        Work_Days = WholeWeeks * 5 + EndDays
        Exit Function
        Else
        DateCnt = DateAdd("d", 1, DateCnt)
    End If
   Loop
   Work_Days = WholeWeeks * 5 + EndDays

    Exit Function

Err_Work_Days:

    ' If either BegDate or EndDate is Null, return a zero
    ' to indicate that no workdays passed between the two dates. '

    If Err.Number = 94 Then
                Work_Days = 0
    Exit Function
    Else
' If some other error occurs, provide a message.
    MsgBox "Error " & Err.Number & ": " & Err.Description
    End If

End Function

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Deddiekoel schreef op 02 september 2004 @ 16:37:
Ik ben eruit!

Ik heb die DateValue dingen weggegooid en een controle erin gezet die kijkt of het restant minder is dan 24 uur.
Just to be sure: Heb je mijn edit gezien waarin ik je wijs op allerlei potentiële problemen en ranzigheid in die functie?

• Taal afhankelijk :X ("Sat" en "Sun")
• Werken met Varianten i.p.v. Strong Typed vars
• Clng(datevar) :X
• ...

[ Voor 17% gewijzigd door RobIII op 02-09-2004 16:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
RobIII schreef op 02 september 2004 @ 16:16:
Daarmee wil ik verder trouwens niet zeggen dat we dit topic maar moeten laten verzanden in compleet offtopic gezever over hoe ranzig dit stukje MS broddelwerk wel/niet is. Nogmaals: Niks tegen MS, het verbaast me alleen dat dit van hun zelf af komt.
't Zal niet de eerste keer zijn. Ik ben eens een VB tutorial tegengekomen die bomvol stond met Goto's. Alsof beginners niet genoeg spaghetti code schrijven :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
RobIII schreef op 02 september 2004 @ 16:39:
[...]

Just to be sure: Heb je mijn edit gezien waarin ik je wijs op allerlei potentiële problemen en ranzigheid in die functie?

• Taal afhankelijk :X ("Sat" en "Sun")
• Werken met Varianten i.p.v. Strong Typed vars
• Clng(datevar) :X
• ...
Ik zie die zaken net pas en ze waren meer dan terecht. Pas met deze aanpassing werkt het echt!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Function Work_Days(BegDate As Date, EndDate As Date) As Integer

   ' Note that this function does not account for holidays.

   Dim WholeWeeks As Integer
   Dim DateCnt As Date
   Dim EndDays As Integer
         
   On Error GoTo Err_Work_Days

   'BegDate = DateValue(BegDate)
   'EndDate = DateValue(EndDate)
   WholeWeeks = DateDiff("w", BegDate, EndDate)
   DateCnt = DateAdd("ww", WholeWeeks, BegDate)
   EndDays = 0
   Do While DateCnt <= EndDate
      If Weekday(DateCnt) <> 1 And _
        Weekday(DateCnt) <> 7 Then
         EndDays = EndDays + 1
      End If
      If DateDiff("h", DateCnt, EndDate) < 24 Then
        Work_Days = WholeWeeks * 5 + EndDays
        Exit Function
        Else
        DateCnt = DateAdd("h", 24, DateCnt)
    End If
   Loop
   Work_Days = WholeWeeks * 5 + EndDays

    Exit Function

Err_Work_Days:

    ' If either BegDate or EndDate is Null, return a zero
    ' to indicate that no workdays passed between the two dates. '

    If Err.Number = 94 Then
                Work_Days = 0
    Exit Function
    Else
' If some other error occurs, provide a message.
    MsgBox "Error " & Err.Number & ": " & Err.Description
    End If

End Function

[ Voor 14% gewijzigd door Deddiekoel op 02-09-2004 17:29 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Trouwens, ik heb de originele functie hier vandaan:
http://support.microsoft.com/?kbid=210562

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dat had ik al gezien, iedereen kan Googlen :Y)

Waarom geeft je functie nu een Integer terug? Waarom geen Long (of desnoods een Currency ofzo)? Tevens zie ik niet waar je functie nu uren teruggeeft (geeft nog steeds dagen terug :? ) en vind ik het nog steeds een flinke lap overbodige code (tenzij je ook met weekends rekent, maar zelfs dan zou ik die one-liner effe aanpassen).

/edit/
:X Volgens mij zit er nog een bugje in mijn code :X check 'm maar effe voordat je 'm in je productieomgeving gooit :Y) Ik ga naar huis en kan me er niet meer druk om maken ... Morgen weer een dag...

[ Voor 22% gewijzigd door RobIII op 02-09-2004 18:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Hij geeft inderdaad nog steeds dagen terug maar de gevoeligheid ligt wel op uren. Dus iets dat op vrijdag 18:00 is gelogd is gaat pas op Maandag 18:00 dag 2 in!

Daarnaast is dit bijna mijn eerst VB ervaring dus ik zal nog wel verder gaan tweaken.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2

Pagina: 1