Avatar billede dougheffernan Nybegynder
09. oktober 2006 - 11:49 Der er 8 kommentarer og
1 løsning

Konvertering til dato

Er det, i VBA, muligt at konvertere
200601
til d. første dag i januar (01-01-2006)
og d. sidste dag i januar (31-01-2006)

Sagen er at min forespørgsel skal hente data for en bestemt måned, som i den ene tabel står på formen yyyymm og i tabellen der skal hentes fra på formen dd-mm-yyyy
Jeg vil jo helst gerne undgå en første/sidste dag i måneden lookup tabel...
Avatar billede dougheffernan Nybegynder
09. oktober 2006 - 11:55 #1
Nærmeste er at lave 2 funktioner som finder hhv. første og sidste dag i måneden.

Public Function EOMonth(InputDate As Date, Optional MonthsToAdd As Integer)
' Returns the date of the last day of month, a specified number of months
' following a given date.
  Dim TotalMonths As Integer
  Dim NewMonth As Integer
  Dim NewYear As Integer

  If IsMissing(MonthsToAdd) Then
      MonthsToAdd = 0
  End If

  TotalMonths = Month(InputDate) + MonthsToAdd
  NewMonth = TotalMonths - (12 * Int(TotalMonths / 12))
  NewYear = Year(InputDate) + Int(TotalMonths / 12)

  If NewMonth = 0 Then
      NewMonth = 12
      NewYear = NewYear - 1
  End If

  Select Case NewMonth
      Case 1, 3, 5, 7, 8, 10, 12
        EOMonth = DateSerial(NewYear, NewMonth, 31)
      Case 4, 6, 9, 11
        EOMonth = DateSerial(NewYear, NewMonth, 30)
      Case 2
        If Int(NewYear / 4) = NewYear / 4 Then
            EOMonth = DateSerial(NewYear, NewMonth, 29)
        Else
            EOMonth = DateSerial(NewYear, NewMonth, 28)
        End If
  End Select
End Function
Avatar billede dougheffernan Nybegynder
09. oktober 2006 - 12:01 #2
Never mind det med den første dag i måneden, der kan også være nogle på arbejde lørdag og søndag, får jeg lige at vide!!! :)

"That could have been brought to my attention YESTERDAY!!!" :(
- Adam Sandler "The weddingsinger"
Avatar billede dougheffernan Nybegynder
09. oktober 2006 - 12:03 #3
Og der var selvfølgelig en fejl i
d. første dag i januar (01-01-2006)
skulle have været
d. første arbejdsdag i januar (02-01-2006)
Avatar billede jesperthomsen Nybegynder
09. oktober 2006 - 12:06 #4
Jeg ville nok benytte mig af dateserial-funktionen. Den kan gøre det ret nemt for dig.

dim fra as date
dim til as date

  fra = dateserial(left(strengdato,4), right(strengdato, 2), 1)
  til = dateserial(year(fra), month(fra)+1,0)

hvor strengdato selvfølgelig er en variabel der indeholder en dato efter formatet yyyymm.

Jeg har bare skrevet koden ind; har slet ikke været omkring Access med den, så der skal måske lige nørkles en smule.
Avatar billede dougheffernan Nybegynder
09. oktober 2006 - 14:32 #5
Hmmmm....hvis f.eks. strengdato = 200609, vil "fra" komme til at indeholde værdien 01-09-2006 og "til" 30-09-2006, hvilket i forespørgslen vil bliver konverteret til
09-01-2006 ("til"-feltets værdi bibeholdes)
Hvordan kan jeg sikre at Access kan forstå at der menes 01-09-2006 og ikke 09-01-2006?
Der er tale om sammenkædede tabeller (.dbf filer)
Avatar billede bak Forsker
09. oktober 2006 - 22:26 #6
Kan du ikke gøre det her direkte i forespørgsel med Format ?
Format([fysiskDato],"mmyyyy")
(FysiskDato er datofelt i tabellen)

Sætningen kynne se således ud i sql

SELECT [TBL Performance].Konto, [TBL Performance].Vendor, [TBL Performance].Fysisk
FROM [TBL Performance]
WHERE (((Format([fysisk],"mmyyyy"))="072006"));
Avatar billede kjulius Novice
09. oktober 2006 - 23:02 #7
Den nemmeste måde at finde frem til en måneds slutdag er faktisk at bruge AddDate til at subtrahere én dag fra den 1. i efterfølgende måned. F.eks.:

tildato = DateAdd("d", - Day(DateAdd("m", 1, fraDato)), AddDate("m", 1, fraDato))

Her bliver der først lagt 1 måned til fraDato, hvorefter der bliver fratrukket det antal dage som day-portion indeholder.

9. oktober 2006 + 1 måned --> 9. november 2006 - 9 dage --> 31. oktober 2006
Avatar billede kjulius Novice
09. oktober 2006 - 23:04 #8
Sorry, det skal naturligvis konsekvent være DateAdd.

tildato = DateAdd("d", - Day(DateAdd("m", 1, fraDato)), DateAdd("m", 1, fraDato))
Avatar billede kjulius Novice
09. oktober 2006 - 23:20 #9
Det er straks værre, hvis du vil til at beregne arbejdsdage, for så skal du også, ud over de faste fridage, til at tage hensyn til skæve helligdage, som baserer sig på påskedag, som igen baserer sig på månekalenderen. Det er meget sjovt! ;-)

Du kan dog få hjælp her:
http://users.chariot.net.au/~gmarts/eastalg.htm

Har du først fundet påskedag, er alle de andre helligdage bare forskudt et fast antal dage i forhold til denne.

Have fun!
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