Avatar billede wired Nybegynder
01. februar 2003 - 23:22 Der er 30 kommentarer og
1 løsning

x antal dage konv. til år,måneder og dage.

Jeg har en database med fra og til datoer, som sammenlagt skal retureres i antal år, måneder og dage.

Jeg kan tælle antallet af dage

Sum(DateDiff("d";[startdato];[slutdato]))

Men vil gerne have 3 felter som deler summen af dage i  antal år, måneder og date. Har dog en del problemer (bl.a. med skudår).

Er åben for at give flere point.
Avatar billede _darkstar_ Nybegynder
01. februar 2003 - 23:25 #1
Jamen er det ikke bare

Sum(DateDiff("m";[startdato];[slutdato]))

og

Sum(DateDiff("y";[startdato];[slutdato]))

??
Avatar billede wired Nybegynder
01. februar 2003 - 23:38 #2
Nej for så får jeg samlet antal år og samlet antal måneder, samt samlet antal dage. Dvs. 12, 146 måneder 4382 dage.
Det jeg søger er (de 4382) om til 12 år 2 måneder og 2 dage
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 00:15 #3
Ups. Det har du ret i.
Avatar billede geminior Nybegynder
02. februar 2003 - 01:10 #4
Hej

Du kan løse det med noget vba kode, så sig til hvis det har interesse.
Avatar billede mugs Novice
02. februar 2003 - 09:57 #5
Se dette spørgsmål:

http://www.eksperten.dk/spm/229500
Avatar billede sjap Praktikant
02. februar 2003 - 12:06 #6
Det er lidt kringlet men prøv med nedenstående funktion (læg den i et modul):


Public Function ÅrMånedDag(StartDato As Date, SlutDato As Date) As String
Dim År As Integer
Dim Måned As Integer
Dim Dag As Integer

År = DateDiff("yyyy", StartDato, SlutDato)
Måned = Month(SlutDato) - Month(StartDato)
Dag = Day(SlutDato) - Day(StartDato)
If Måned < 0 Or Dag < 0 Then År = År - 1

StartDato = DateAdd("yyyy", År, StartDato)
Måned = DateDiff("m", StartDato, SlutDato)
If Dag < 0 Then Måned = Måned - 1

StartDato = DateAdd("m", Måned, StartDato)
Dag = DateDiff("d", StartDato, SlutDato)

ÅrMånedDag = År & " år, "
ÅrMånedDag = ÅrMånedDag & Måned & " måneder og "
ÅrMånedDag = ÅrMånedDag & Dag & " dage"

End Function
Avatar billede sjap Praktikant
02. februar 2003 - 12:08 #7
De sidste tre linier (der begynder med "ÅrMånedDag") er blot en formatering af resultatet. Dem kan du uden videre ændre, så de passer til dit behov.
Avatar billede wired Nybegynder
02. februar 2003 - 14:12 #8
Jeg er lidt i tvivl om hvordan jeg får det ind i min forespørgelse.

Som nævnt i spørgsmålet er jeg en gruppe af personer med flere forskellige perioder tilknyttet. eksempel:

per1: fra 1-2-93  til 2-5-94
      fra 4-4-96  til 7-7-97
      fra 9-6-98  til 1-4-02

per2: fra 5-2-90  til 5-3-92
      fra 5-8-93  til 1-5-96

Nu vil jeg gerne have det samlede antal år, måneder og dage som hver person har opsamlet og helst som en forespørgelse da jeg skal arbejde videre med det.

Følgende giver det samlede antal dage:

Sum(DateDiff("m";[startdato];[slutdato]))

Men hvordan med måneder og år (samt skudår) i en forespørgelse?

Kan jeg bruge jeres eksempler direkte i en forespørgelse? Kræver det ikke en formular (hvilket jeg ikke er interesseret i), eller kan man oprette det som en funktion som kan anvendes i en forespørgelse? Håber at det kan lade sig gøre.

Er tilbage i aften...
Avatar billede geminior Nybegynder
02. februar 2003 - 14:39 #9
Ok, først et lille bugfix til superjaps svar, rettelsen er markeret til højre med '** Bugfix **.

En anden ting, brug aldrig charset specifikke tegn i kode, såsom æ,ø og å. I det hele taget bør al kode skrives på engelsk, så det kan læses af en lidt større community en danske udviklere.

Til den anden del af dit spørgsmål wired, så har jeg ikke det store at byde på, da jeg ikke er Access bruger.


Public Function AarMaanedDag(StartDato as Date, SlutDato as Date) as String
Dim Aar as Integer
Dim Maaned as Integer
Dim Dag as Integer

Aar = DateDiff("yyyy", StartDato, SlutDato)
Maaned = Month(SlutDato) - Month(StartDato)
Dag = Day(SlutDato) - Day(StartDato)
If (Maaned < 0) Or (Maaned = 0 And Dag < 0) Then Aar = Aar - 1 '** Bugfix **

StartDato = DateAdd("yyyy", Aar, StartDato)
Maaned = DateDiff("m", StartDato, SlutDato)
If Dag < 0 Then Maaned = Maaned - 1

StartDato = DateAdd("m", Maaned, StartDato)
Dag = DateDiff("d", StartDato, SlutDato)

AarMaanedDag = Aar & " Aar, "
AarMaanedDag = AarMaanedDag & Maaned & " mAaneder og "
AarMaanedDag = AarMaanedDag & Dag & " dage"

End Function
Avatar billede sjap Praktikant
02. februar 2003 - 16:02 #10
wired

Du laver blot et ny modul, og kopierer den ovenstående kode, og gemmer modulet. Så skulle du faktisk kunne kalde funktionen direkte fra en forespørgsel:

ÅrMånedDag(StartDato; SlutDato)
Avatar billede sjap Praktikant
02. februar 2003 - 17:04 #11
geminior

Godt set. Den havde jeg ikke fanget.

Hvorvidt man nu vælger at bruge æ, ø og å er helt klart et personligt valg. Jeg har ikke noget problem med disse karakterer (og det er faktisk helt tilbage til tiden med DOS, jeg sidst havde det, men det kan skyldes held). Til mit brug af kode skal jeg ikke udveksle kode med ikke-danskere, så jeg kan skrive koden, så jeg synes den er let at læse. Det er da ok, at du synes at koden generelt skal ryddes for danske karakterer, jeg er bare helt uenig i.
Avatar billede wired Nybegynder
02. februar 2003 - 22:48 #12
Nu har jeg oprettet modulet, indsat teksten/funktionen og tilføjet den i en forespørgelse, men får følgende svar:

Der er en ikke-defineret funktion "AarMaanedDag" i udtrykket.

Jeg har valgt geminiors funktion
Avatar billede sjap Praktikant
02. februar 2003 - 22:55 #13
Den kører fint her. Min forespørgsel ser således ud:

SELECT StartDato, SlutDato, AarMaanedDag([StartDato],[SlutDato]) AS strDato
FROM tblDato;
Avatar billede sjap Praktikant
02. februar 2003 - 23:08 #14
Nåh, nu kan jeg se det. Problemet er, at din forespørgsel ikke kan finde AarMaanedDag funktionen. Hvordan har du gemt den i modulet? Har du kopieret ovenstående og sat det ind, eller har du skrevet det selv? Noget tyder på der er en stavefejl i modulet eller i funktionen - kontroller lige det.
Avatar billede wired Nybegynder
03. februar 2003 - 00:04 #15
Åhhh jeg var kommet til at kalde modulet AarMaanedDag altså det samme som funktionen - det går ikke. Da summen skal fordeles på tre felter aar, maaneder og dage, formoder jeg at jeg skal lave tre moduler, eller en variable i funktionen der indikere hvilken værdi jeg ønsker tilbage.
Jeg har nu forstået formålet med moduler og kombinationen med forespørgelser - ganske genialt.
Avatar billede wired Nybegynder
03. februar 2003 - 00:13 #16
Men hvilken type skal funktionen returnere hvis det skal passe til en sum.
Altså
  sum(ÅrMånedDag(StartDato; SlutDato);1)
Avatar billede wired Nybegynder
03. februar 2003 - 00:13 #17
Ved type mener jeg: Integer, byte, variant, double etc...
Har prøvet ovenstående.
Avatar billede wired Nybegynder
03. februar 2003 - 00:19 #18
Når jeg bruger moduler syntes den ikke at ville bruge sum ???
Avatar billede wired Nybegynder
03. februar 2003 - 00:20 #19
Var ellers så tæt på ....
Avatar billede sjap Praktikant
03. februar 2003 - 08:20 #20
Prøv med Integer.
Avatar billede wired Nybegynder
03. februar 2003 - 09:26 #21
Jeg har prøvet med Integer uden held.
Ups: Der skulle forøvrigt også have stået:
  sum(ÅrMånedDag(StartDato; SlutDato;1))
Avatar billede sjap Praktikant
03. februar 2003 - 14:57 #22
Havde du ikke valgt AarMaanedDag i stedet for ÅrMånedDag?
Avatar billede sjap Praktikant
03. februar 2003 - 14:58 #23
Jeg har skrevet funktionen lidt om, så du nu også skal vælge mellem år, måned og dag (jeg går ud fra det svarer til det du har skrevet):

Public Function AarMaanedDag(StartDato As Date, SlutDato As Date, ResultatType As Integer) As Integer
Dim Aar As Integer
Dim Maaned As Integer
Dim Dag As Integer

Aar = DateDiff("yyyy", StartDato, SlutDato)
Maaned = Month(SlutDato) - Month(StartDato)
Dag = Day(SlutDato) - Day(StartDato)
If (Maaned < 0) Or (Maaned = 0 And Dag < 0) Then Aar = Aar - 1

StartDato = DateAdd("yyyy", Aar, StartDato)
Maaned = DateDiff("m", StartDato, SlutDato)
If Dag < 0 Then Maaned = Maaned - 1

StartDato = DateAdd("m", Maaned, StartDato)
Dag = DateDiff("d", StartDato, SlutDato)

If ResultatType = 1 Then
    AarMaanedDag = Aar
Else
    If ResultatType = 2 Then
        AarMaanedDag = Maaned
    Else
        AarMaanedDag = Dag
    End If
End If

End Function
Avatar billede sjap Praktikant
03. februar 2003 - 15:01 #24
Med ovenstående funktion kan år hentes og summeres (hvad så ellers lige skal bruge det til):

SELECT Sum(AarMaanedDag([StartDato],[SlutDato],1)) AS SumÅr
FROM tblDato;
Avatar billede wired Nybegynder
03. februar 2003 - 16:28 #25
Hvis jeg summere og følgende datoer:

02-02-1986    06-02-1990
01-01-1991    28-01-1993
02-02-1993    05-05-1994
06-06-1994    27-08-1997
09-09-1997    04-03-1998
21-11-2002    21-12-2003

Får jeg 11 år, 11 måneder og 78 dage.

Noget er galt....

Jeg tror det skyldes at der for hver periode tælles antal år, måneder og dage, men at der efter hver post-summering ikke tages forbehold for at flytte overskudet af dage over til måneder og overskudet af måneder over til år.

Det var derfor at jeg startede med at ville summere antallet af dage for hver periode og til sidst dele det op i år, måneder og dage...

Jeg kan pt. dog ikke lige finde en løsning på problemet.

Du havde ret i at jeg anvender AarMaanedDag og ikke ÅrMånedDag
Avatar billede wired Nybegynder
03. februar 2003 - 16:29 #26
Måske hvis man kan lave globale variabler i et modul. Således at man kan checke dem efter hver post-summering (altså for hver periode som som lægges sammen).
Avatar billede sjap Praktikant
03. februar 2003 - 16:35 #27
Du er derfor nødt til at summere dagene først:

Sum(DateDiff("d", StartDato, SlutDato))
Avatar billede sjap Praktikant
03. februar 2003 - 16:41 #28
Prøv med en ny funktion, der er baseret på antal dage.

Public Function AarMaanedDag2(AntalDage As Long) As String
Dim Aar As Integer
Dim Maaned As Integer
Dim Dag As Integer
Dim StartDato As Date
Dim SlutDato As Date

StartDato = #1/1/2000#
SlutDato = StartDato + AntalDage

Aar = DateDiff("yyyy", StartDato, SlutDato)
Maaned = Month(SlutDato) - Month(StartDato)
Dag = Day(SlutDato) - Day(StartDato)
If (Maaned < 0) Or (Maaned = 0 And Dag < 0) Then Aar = Aar - 1

StartDato = DateAdd("yyyy", Aar, StartDato)
Maaned = DateDiff("m", StartDato, SlutDato)
If Dag < 0 Then Maaned = Maaned - 1

StartDato = DateAdd("m", Maaned, StartDato)
Dag = DateDiff("d", StartDato, SlutDato)

AarMaanedDag2 = Aar & " år, "
AarMaanedDag2 = AarMaanedDag2 & Maaned & " måneder og "
AarMaanedDag2 = AarMaanedDag2 & Dag & " dage"

End Function
Avatar billede sjap Praktikant
03. februar 2003 - 16:43 #29
Med denne funktion og nedenstående forespørgsel skulle vi vist næste´n være der:

SELECT Sum(DateDiff("d",[StartDato],[SlutDato])) AS SumDage, AarMaanedDag2([SumDage]) AS strAaMaanedDag FROM tblDato;
Avatar billede wired Nybegynder
03. februar 2003 - 18:35 #30
Nu ser det ud til at være tættere på. Jeg er dig meget taknemlig.

Umiddelbart ser det ud til at der kun er en dag forkert uafhængigt af
antal perioder og periode-strækninger.

f.eks. giver perioden
25-11-1993    25-11-2002

8 år. 11 måneder og 30 dage.

Det ser ud til at være efter første skudår, men det elimineres efter anden skudår, det tror jeg godt at jeg kan leve med.

Vil lige rette op på funktionen så den laver et felt med hhv. år, måneder og dage, men kan sikkert gøres på sammemåde som ved forrige funktion.

Det ser ud til at problemet er løst. Jeg takker mange gange,
og tilføjer ekstra 20 points.
Avatar billede sjap Praktikant
03. februar 2003 - 18:54 #31
Mange tak for det! :-)
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