Avatar billede Sinox Nybegynder
03. august 2012 - 14:02 Der er 11 kommentarer

Datoer går igennem denne måned

Hej

Jeg har strStart og strSlut som hver indeholder en dato.

Lad os sige det er 23/07/12 - 24/08/12

Jeg skal så lave en funktion som tjekker om denne tidsperiode går igennem august 2012 måned.

Dvs en true/false funktion

Hvordan griber jeg det an?
Avatar billede softspot Forsker
03. august 2012 - 14:15 #1
Hvad mener du med at den "går igennem august"?

Der er flere måder at tjekke om et datointerval helt eller delvist dækker en given måned. Umiddelbart kunne jeg forstille mig at du tog måneden for start og slut og tjekkede om startmåneden var mindre end eller lig med august og alt efter det første tjek, derefter tjekkede om slutmåneden var større end eller lig med august.

Såvidt jeg husker findes der en month-funktion som returnerer måneden for en dato:

if month(startdato) <= 8 and month(slutdato) >= 8 then
  ' intervallet krydser august
else
  ' intervallet krydser ikke august
end if
Avatar billede mireigi Novice
03. august 2012 - 14:16 #2
Når du skriver "går igennem august 2012", hvad mener du så helt præcist?

Skal slutdatoen være en dato i august 2012?
Skal startdatoen være i august 2012?
Skal startdatoen være før august 2012, og slutdatoen efter?
Avatar billede mireigi Novice
03. august 2012 - 14:18 #3
@softspot: Den løsning er ikke helt sikker, da den ikke tager højde for årstallet.
Avatar billede softspot Forsker
03. august 2012 - 14:24 #4
@mireigi: Det har du da ret i! Så må man evt. benytte year-funktionen i samspil med den løsning jeg viste...

Alternativt kan man gennemløbe alle datoer i august og se om en af dem ligger mellem start og slut-datoerne.
Avatar billede mireigi Novice
03. august 2012 - 14:52 #5
Man kan også bare bruge DateDiff:

'Start date is before 01/08/12
blnStartsBefore = DateDiff("d", startDate, Date("01/08/12")) >= 0

'End date is after 01/08/12
blnEndsAfter = DateDiff("d", Date("01/08/12"), endDate) >= 0

If blnStartsBefore AND blnEndsAfter Then
  'Do your magic
End If
Avatar billede softspot Forsker
03. august 2012 - 14:58 #6
@mireigi: Hvad nu hvis intervallet hedder 5/8-2012 til 17/8-2012?
Avatar billede mireigi Novice
03. august 2012 - 17:54 #7
Det her må være den komplette løsning der tager højde for alle muligheder.

(Jeg foretrækker at bruge engelske variabelnavne, så kommentarer er også på engelsk)

' Check if start date is before end date
blnBeginsBeforeEnding = DateDiff("d", startDate, endDate) > 0

' Check if start date is before the end of August
blnBeginsBeforeAugEnds = DateDiff("d", startDate, Date("31/08/12")) >= 0

'Check if the end date is after the beginning of August
blnEndsAfterAugBegins = DateDiff("d", Date("01/08/12"), endDate) >= 0

' Holds whether or not the timespan intersects August
blnIntersectsAug = False

If NOT blnBeginsBeforeEnding Then
  ' Check if start date and end date are the same
  If DateDiff("d", startDate, endDate) = 0 Then

      ' If the start date is in August, the timespan intersects August
      blnIntersectsAug = blnBeginsBeforeAugEnds
  Else
      ' Handle invalid timespan
  End If
Else If blnBeginsBeforeAugEnds AND blnEndsAfterAugBegins Then
  blnIntersectsAug = True
End If

If blnIntersectsAug Then
  ' Do your magic here
End If
Avatar billede mireigi Novice
03. august 2012 - 18:12 #8
Og som samlet funktion:

Function CheckForMonthIntersect(dtmBegin, dtmEnd, intYear, intMonth)
  ' Holds the first day of the month
  dtmMonthBegin = DateSerial(intYear, intMonth, 1)

  'Holds the last day of the month
  dtmMonthEnd = DateSerial(intYear, intMonth + 1, 0)

  ' Check if start date is before end date
  blnBeginsBeforeEnding = DateDiff("d", dtmBegin, dtmEnd) > 0

  ' Check if start date is before the end of August
  blnBeginsBeforeAugEnds = DateDiff("d", dtmBegin, dtmMonthEnd) >= 0

  'Check if the end date is after the beginning of August
  blnEndsAfterAugBegins = DateDiff("d", dtmMonthBegin, dtmEnd) >= 0

  ' Holds whether or not the timespan intersects August
  blnIntersectsAug = False

  If NOT blnBeginsBeforeEnding Then
      ' Check if start date and end date are the same
      If DateDiff("d", dtmBegin, dtmEnd) = 0 Then

        ' If the start date is in August, the timespan intersects August
        CheckForMonthIntersect = blnBeginsBeforeAugEnds
        Exit Function
      Else
        ' The timespan is invalid, so no check can be made
        CheckForMonthIntersect = False
        Exit Function
      End If
  Else If blnBeginsBeforeAugEnds AND blnEndsAfterAugBegins Then
      CheckForMonthIntersect = True
  End If
End Function
Avatar billede softspot Forsker
03. august 2012 - 20:26 #9
Kunne man ikke bare tilpasse den stump kode jeg startede med at vise (og som jeg oprindeligt foreslog):

if month(startdato) <= 8 _
  and month(slutdato) >= 8 _
  and year(startdato) <= year(slutdato) _
then
  ' intervallet krydser august
else
  ' intervallet krydser ikke august
end if
Avatar billede softspot Forsker
03. august 2012 - 20:30 #10
Som en funktion kunne det udtrykkes således:

function KrydserMaaned(startdato, slutdato, maaned)
  KrydserMaaned = month(startdato) <= maaned _
                  and month(slutdato) >= maaned _
                  and year(startdato) <= year(slutdato)
end function
Avatar billede mireigi Novice
05. august 2012 - 15:16 #11
Jo, den vil gøre det samme.

Eneste forskel er, at du sammenligner på måned og år, hvor jeg også sammenligner på dag, med kontrol af gyldigt interval.

Din er dog nok den hurtigste og mest overskuelige :)
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
Kurser inden for grundlæggende programmering

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



Seneste spørgsmål Seneste aktivitet
I dag 06:10 Excel åbner fil i kæmpe format Af Aske i Excel
I går 22:00 Datafordeler Af Lsk i PHP
I går 12:37 Summere beløb pr. dato Af TTA i Excel
31/1022:44 Tilslutte chassic fans Af viking69 i PC
31/1020:28 LED lysstofrør Af ErikHg i Fri debat