Avatar billede malmskov Nybegynder
17. januar 2008 - 11:27 Der er 33 kommentarer og
2 løsninger

Tidsudregning - får forkert resultat ved > 1 døgn

Har felt FRA (Standard Dato Format) og felt TIL (Samme format)i tabel.
Har lavet formular med felterne (et DATAARK) og ønsker at udregne difference (Nogle differencer er på > 1 døgn).
Har lavet ubundet felt til difference og prøvet at skrive =[Til]-[Fra]. Dette fungerer godt nok så længe der ikke er mere end 1 døgn, hvis jeg f.eks. har 1 døgn+16 timer skrives der som resultat: -1899 16.00.00 og 2 døgn+16 timer giver -1900 16.00.00
Har valgt Standard Dato format for feltet.
Hvad gør jeg forkert???
Avatar billede Slettet bruger
17. januar 2008 - 12:10 #1
Lav 2 felter et til at vise dage:
=[Til]-[Fra]-0,5
Format: 0

og et til at vise timer:
=[Til]-[Fra]
Format: Langt klokkeslætsformat
Avatar billede malmskov Nybegynder
17. januar 2008 - 12:28 #2
Får resultat ved dage: 2,1666666666
Sætter jeg FORMAT til Standard og 0 decimaler skrives der 2.
Hvis jeg vil gange med 24 - så husker den vel stadig decimaler - kan jeg slippe af med dem?

Kan jeg lave felterne i en forespørgsel (med kilde fra min indtastning)og samtidig lave et felt som ganger dag med 24 timer. Og på den måde få et samlet timetal ind i formularen?

Er først tilbage i aften
Avatar billede hnteknik Novice
17. januar 2008 - 12:38 #3
=Datediff("n",[FRA],[TIL])
Avatar billede Slettet bruger
17. januar 2008 - 12:39 #4
skrev du 0 ved format?~)
Avatar billede hnteknik Novice
17. januar 2008 - 12:40 #5
Undskyld h står for 'hours' og 'n' står for 'minutes' og s står for 'seconds'.
Logisk".

Derfor

Datediff("h",[FRA],[TIL])
Avatar billede Slettet bruger
17. januar 2008 - 12:45 #6
Ja, jeg skulle lige til at sige det... og hvis du kun er ude efter timeantallet og intet andet, så er det hntekniks løsning, der er den korrekte!~)
Avatar billede Slettet bruger
17. januar 2008 - 12:48 #7
men du skal vel have nogle minutter med også....
Avatar billede Slettet bruger
17. januar 2008 - 12:59 #8
Hvordan gør man det, med datediff. Jeg syntes ikke rigtig, at jeg kan få den til at makke ret?~)
Avatar billede terry Ekspert
17. januar 2008 - 13:03 #9
havent looked at all answers/comments. How do you want to see the result?

You cant use a date/tine field to show you 25Hrs 59 minutes because there is only 24 hours in a day. But you can dipslay this in a text field.

Here is a piece of code which can do this.

________________________________________
'***************** Code Start **************
Public Function Diff2Dates(Interval As String, Date1 As Date, Date2 As Date, _
Optional ShowZero As Boolean = False) As Variant
'Author:    © Copyright 2001 Pacific Database Pty Limited
'          Graham R Seach MCP MVP gseach@pacificdb.com.au
'          Phone: +61 2 9872 9594  Fax: +61 2 9872 9593
'          This code is freeware. Enjoy...
'          (*) Amendments suggested by Douglas J. Steele MVP
'
'Description:  This function calculates the number of years,
'              months, days, hours, minutes and seconds between
'              two dates, as elapsed time.
'
'Inputs:    Interval:  Intervals to be displayed (a string)
'          Date1:      The lower date (see below)
'          Date2:      The higher date (see below)
'          ShowZero:  Boolean to select showing zero elements
'
'Outputs:  On error: Null
'          On no error: Variant containing the number of years,
'              months, days, hours, minutes & seconds between
'              the two dates, depending on the display interval
'              selected.
'          If Date1 is greater than Date2, the result will
'              be a negative value.
'          The function compensates for the lack of any intervals
'              not listed. For example, if Interval lists "m", but
'              not "y", the function adds the value of the year
'              component to the month component.
'          If ShowZero is True, and an output element is zero, it
'              is displayed. However, if ShowZero is False or
'              omitted, no zero-value elements are displayed.
'              For example, with ShowZero = False, Interval = "ym",
'              elements = 0 & 1 respectively, the output string
'              will be "1 month" - not "0 years 1 month".

On Error GoTo Err_Diff2Dates

  Dim booCalcYears As Boolean
  Dim booCalcMonths As Boolean
  Dim booCalcDays As Boolean
  Dim booCalcHours As Boolean
  Dim booCalcMinutes As Boolean
  Dim booCalcSeconds As Boolean
  Dim booSwapped As Boolean
  Dim dtTemp As Date
  Dim intCounter As Integer
  Dim lngDiffYears As Long
  Dim lngDiffMonths As Long
  Dim lngDiffDays As Long
  Dim lngDiffHours As Long
  Dim lngDiffMinutes As Long
  Dim lngDiffSeconds As Long
  Dim varTemp As Variant

  Const INTERVALS As String = "dmyhns"

'Check that Interval contains only valid characters
  Interval = LCase$(Interval)
  For intCounter = 1 To Len(Interval)
      If InStr(1, INTERVALS, Mid$(Interval, intCounter, 1)) = 0 Then
        Exit Function
      End If
  Next intCounter

'Check that valid dates have been entered
  If Not (IsDate(Date1)) Then Exit Function
  If Not (IsDate(Date2)) Then Exit Function

'If necessary, swap the dates, to ensure that
'Date1 is lower than Date2
  If Date1 > Date2 Then
      dtTemp = Date1
      Date1 = Date2
      Date2 = dtTemp
      booSwapped = True
  End If

  Diff2Dates = Null
  varTemp = Null

'What intervals are supplied
  booCalcYears = (InStr(1, Interval, "y") > 0)
  booCalcMonths = (InStr(1, Interval, "m") > 0)
  booCalcDays = (InStr(1, Interval, "d") > 0)
  booCalcHours = (InStr(1, Interval, "h") > 0)
  booCalcMinutes = (InStr(1, Interval, "n") > 0)
  booCalcSeconds = (InStr(1, Interval, "s") > 0)

'Get the cumulative differences
  If booCalcYears Then
      lngDiffYears = Abs(DateDiff("yyyy", Date1, Date2)) - _
              IIf(Format$(Date1, "mmddhhnnss") <= Format$(Date2, "mmddhhnnss"), 0, 1)
      Date1 = DateAdd("yyyy", lngDiffYears, Date1)
  End If

  If booCalcMonths Then
      lngDiffMonths = Abs(DateDiff("m", Date1, Date2)) - _
              IIf(Format$(Date1, "ddhhnnss") <= Format$(Date2, "ddhhnnss"), 0, 1)
      Date1 = DateAdd("m", lngDiffMonths, Date1)
  End If

  If booCalcDays Then
      lngDiffDays = Abs(DateDiff("d", Date1, Date2)) - _
              IIf(Format$(Date1, "hhnnss") <= Format$(Date2, "hhnnss"), 0, 1)
      Date1 = DateAdd("d", lngDiffDays, Date1)
  End If

  If booCalcHours Then
      lngDiffHours = Abs(DateDiff("h", Date1, Date2)) - _
              IIf(Format$(Date1, "nnss") <= Format$(Date2, "nnss"), 0, 1)
      Date1 = DateAdd("h", lngDiffHours, Date1)
  End If

  If booCalcMinutes Then
      lngDiffMinutes = Abs(DateDiff("n", Date1, Date2)) - _
              IIf(Format$(Date1, "ss") <= Format$(Date2, "ss"), 0, 1)
      Date1 = DateAdd("n", lngDiffMinutes, Date1)
  End If

  If booCalcSeconds Then
      lngDiffSeconds = Abs(DateDiff("s", Date1, Date2))
      Date1 = DateAdd("s", lngDiffSeconds, Date1)
  End If

  If booCalcYears And (lngDiffYears > 0 Or ShowZero) Then
      varTemp = lngDiffYears & IIf(lngDiffYears <> 1, " years", " year")
  End If

  If booCalcMonths And (lngDiffMonths > 0 Or ShowZero) Then
      If booCalcMonths Then
        varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                  lngDiffMonths & IIf(lngDiffMonths <> 1, " months", " month")
      End If
  End If

  If booCalcDays And (lngDiffDays > 0 Or ShowZero) Then
      If booCalcDays Then
        varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                  lngDiffDays & IIf(lngDiffDays <> 1, " days", " day")
      End If
  End If

  If booCalcHours And (lngDiffHours > 0 Or ShowZero) Then
      If booCalcHours Then
        varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                  lngDiffHours & IIf(lngDiffHours <> 1, " hours", " hour")
      End If
  End If

  If booCalcMinutes And (lngDiffMinutes > 0 Or ShowZero) Then
      If booCalcMinutes Then
        varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                  lngDiffMinutes & IIf(lngDiffMinutes <> 1, " minutes", " minute")
      End If
  End If

  If booCalcSeconds And (lngDiffSeconds > 0 Or ShowZero) Then
      If booCalcSeconds Then
        varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                  lngDiffSeconds & IIf(lngDiffSeconds <> 1, " seconds", " second")
      End If
  End If

  If booSwapped Then
      varTemp = "-" & varTemp
  End If

  Diff2Dates = Trim$(varTemp)

End_Diff2Dates:
  Exit Function

Err_Diff2Dates:
  Resume End_Diff2Dates

End Function
'************** Code End *****************
Avatar billede terry Ekspert
17. januar 2008 - 13:04 #10
an some examples on how to use it.


?Diff2Dates("y", #06/01/1998#, #06/26/2002#)
4 years
?Diff2Dates("ymd", #06/01/1998#, #06/26/2002#)
4 years 25 days
?Diff2Dates("ymd", #06/01/1998#, #06/26/2002#, True)
4 years 0 months 25 days
?Diff2Dates("d", #06/01/1998#, #06/26/2002#)
1486 days

?Diff2Dates("h", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
42 hours
?Diff2Dates("hns", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
42 hours 47 minutes 33 seconds
?Diff2Dates("dhns", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
1 day 18 hours 47 minutes 33 seconds

?Diff2Dates("ymd",#12/31/1999#,#1/1/2000#)
1 day
?Diff2Dates("ymd",#1/1/2000#,#12/31/1999#)
-1 day
?Diff2Dates("ymd",#1/1/2000#,#1/2/2000#)
1 day
Avatar billede Slettet bruger
17. januar 2008 - 13:14 #11
Så kom det tunge skyts frem!~)
Avatar billede hnteknik Novice
17. januar 2008 - 15:51 #12
Som du bruger din egen

=Datediff("h",[FRA-datoogklokkeslet],[TIL-datoogklokkeslet])

Se alle brugsmuligheder under Datediff - under hjælp
Avatar billede malmskov Nybegynder
17. januar 2008 - 20:43 #13
Jeg skal bruge både timer og minutter - eller et decimaltal som kan ganges med 24 og derved giver total antal timer mellem 2 datoer og klokkeslet.

TERRY - hvor sætter jeg koderne ind - det her er min første "rigtige" database.
Jeg kan se at jeg skal omdøbe mine indputfelter til Date1 og Date2
Skal der "bare" oprettet et nyt ubundet felt og så kopieres kode ind i kodegenerator (Visual Basic) - Udregningen skulle gerne ske når jeg har indtastet i Date 1 og 2 og så bruger tabulator for at komme til næste felt.

HNTEKNIK - datediff giver mærkeligt resultat
Lige nu får jeg med Datediff følgende: Fra 01-01-2008 22:00  Til 02-01-2008 02:00 Resultat -6 timer. Ændres klokkeslet i Til - 08:00 får jeg 0,00 som reslutat.

SPK
Det virker bortset fra at når jeg så ganger dag med 24 timer får jeg et forkert resultat pga skjulte decimaler i feltet der udregner antal dage.
Avatar billede hnteknik Novice
17. januar 2008 - 21:19 #14
Ja det forstår jeg ikke, du mågøre noget forkert:

Fra                    Til                  timer    Minutter    timerminut
18-01-2008 23:12:00    19-01-2008 14:56:00    15    944    15,7333333333333
18-01-2008 23:12:00    21-01-2008 02:29:00    51    3077    51,2833333333333
01-01-2008 22:00:00    02-01-2008 02:00:00    4    240    4
Avatar billede malmskov Nybegynder
17. januar 2008 - 23:42 #15
Jeg ved ikke hvad det er der går galt i formularen når jeg vil putte DateDiff ind i feltet men-----
Tak for jeres hjælp - her er hvad jeg har fået til at fungere.
Jeg forsøgte følgende som kontrolkildeelement =[Til]-[Fra]
Format "0"
Decimaler 2
Og nu giver den resultat korrekt i decimaltal - og det ser ud til at virke hver gang.
Jeg ganger så i næste felt med 24 og det fungerer også.

DateDiff vil ikke rigtigt fungere.
hnteknik - Er dit eksempel fra en formular hvor alt laves i felterne??
I så fald kunne jeg godt tænke mig at se den. exbil@mail.dk
MVH Vagn
Avatar billede terry Ekspert
18. januar 2008 - 08:25 #16
You can put the code in a module. and you dont have to rename your input fields to Date1 and Date2. The function declaration can use any names an dthey dont have to be the same as those which are sent to the function.

So if you use this example
?Diff2Dates("hns", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
42 hours 47 minutes 33 seconds

In stead DateDiff you would use
Diff2Dates("hns", [Fra], [Til])
Avatar billede Slettet bruger
18. januar 2008 - 08:47 #17
Prøv denne her:

=(DateDiff("d";[fra];[til])*24) & ":" & Format(([til]-[fra]);"nn:ss")
Avatar billede hnteknik Novice
18. januar 2008 - 09:00 #18
Jeg har det hele i en forespørgsel:

SELECT datediff.[Fra], datediff.[Til], DateDiff("h",datediff![Fra],datediff![Til]) AS timer, DateDiff("n",datediff![Fra],datediff![Til]) AS Minutter, DateDiff("n",datediff![Fra],datediff![Til])/60 AS timerminut
FROM datediff;

Tabellen hedder datediff ;-)
Avatar billede Slettet bruger
18. januar 2008 - 09:31 #19
Nej, sådan her selvfølgelig:

=(DateDiff("d";[fra];[til])*24)+Format(([til]-[fra]);"hh") & ":" & Format(([til]-[fra]);"nn:ss")

men det ser til gengæld ud til at virke efter hensigten!~)
Avatar billede malmskov Nybegynder
18. januar 2008 - 09:34 #20
spg - din formel med datadiff giver forkert resultat - den regner antal hele døgn og viser derfor hele tiden 24 timer i feltet uanset timetal.
Den simple som vi startede med viser korrekt hele tiden - jeg har lært at paranteser hjælper med at udvide beregning så nu laver jeg det i et felt ved at skrive dette som kontrolelement: =([Til]-[Fra])*24
I format skrives 0
Og jeg vælger 2 decimaler - nu får jeg resultat som decimaltal og kan anvende det.
Avatar billede malmskov Nybegynder
18. januar 2008 - 09:44 #21
Terry
Jeg har kopieret hele programkoden ind  i Visual Basic
Jeg har lavet et nyt felt i formularen (ubundet) og skrevet følgende i kontrolkilde element: Diff2Dates("hns", [Fra], [Til])
Desværre viser feltet bare: #Navn?
Format feltet er tomt.
Jeg vil gerne have dette til at virke da jeg så har en mulighed for at få vist dage,timer,minutter. Jeg har oprettet et ekstra spørgsmål med 100 points til dig hvis jeg får det igang.
Det er ikke sådan at jeg skal indsætte formlen i fanen hændelser.
Avatar billede malmskov Nybegynder
18. januar 2008 - 10:11 #22
HNTEKNIK - det er en underformular som jeg arbejder i og den får felter direkte fra tabel.
Vil jeg være bedre tjent med (hurtigere database) ved altid at lave en forespørgsel som så ligger til grund for mine formularer?
Avatar billede malmskov Nybegynder
18. januar 2008 - 10:12 #23
TNTEKNIK
Det er en underformular med alle felter fra en tabel jeg har.
Vil jeg være bedre tjent med at lade den gå via en forespørgsel og så lade formular hente felter fra forespørgsel - hurtigere database???
Avatar billede malmskov Nybegynder
18. januar 2008 - 10:26 #24
SPG
Fantastisk - nu kommer der bare et komplet resultat med alle informationer - tak for den ihærdighed som alle har.
I har alle fortjent at få hver 100 points for dette kæmpe arbejde.

En sidste ting - hvad gør jeg ved inputmaske så jeg undgår at indtaste årstal og mellemrum.
Har brugt 00-00-0000 00:00 - men så skal jeg indtaste alt hver gang jeg vil rette.
Sekunder fylder den selv på når jeg hopper til næste felt - de vil altid være 00 og jeg kan ikke undgå dem ser det ud til.

Laver lige 100 points til dig SPG i nyt spørgsmål
Avatar billede terry Ekspert
18. januar 2008 - 10:37 #25
This works in the Control Source. If your using Danish regional settings you will need to replace , with ;

=Diff2Dates("hns";[Fra];[Til])
Avatar billede terry Ekspert
18. januar 2008 - 10:38 #26
It shouldnt be necessary to open new quetsions to give points as this question is still open.
Avatar billede Slettet bruger
18. januar 2008 - 11:04 #27
Avatar billede malmskov Nybegynder
18. januar 2008 - 11:05 #28
Terry
Den returnerer stadig: #Navn?
Jeg indsætter formlen i kontrolkildeelement og ændrer intet ved format - feltet er tomt.

Koderne: Klikket på Programkode i værktøjslinien og kopieret kode ind i vindue som åbnes og vindue viser at det er gemt med tilknytning til min Underformular hvor tingene indtastes.
Option Compare Database - teksten starter således og så er der en streg hele vejen over - herefter er dine koder indsat.
Avatar billede terry Ekspert
18. januar 2008 - 11:11 #29
If you have a solution then we dont need to worry, unless you want to use this function?
Avatar billede malmskov Nybegynder
18. januar 2008 - 11:51 #30
Terry - det irriterer mig at jeg ikke kan få det til at virke - jeg skal til at bruge kode i databasen og derfor tæller al erfaring.

Jeg har fået løsning - både som decimaltal og som DateDiff med timer om minutter
Avatar billede terry Ekspert
18. januar 2008 - 11:57 #31
If its possible for you to send me your db, or an example then I'll see if I can get it to work for you.
ekspertenATsanthell.dk

AT = @
Avatar billede hnteknik Novice
18. januar 2008 - 12:20 #32
Ja - lad din underformular hente data fra en forespørgsel gemt ved navn. Det er relativt nemmere at rette i forespørgelsen - og så kan du jo have de beregnende felter gemt der. Og jo mere databasen kan regne ud selv - uden at skulle over noget VBA udenfor - jo hurtigere afvikles tingene.

>Det er en underformular med alle felter fra en tabel jeg har.
>Vil jeg være bedre tjent med at lade den gå via en forespørgsel og så lade formular >hente felter fra forespørgsel - hurtigere database???
Avatar billede terry Ekspert
18. januar 2008 - 12:32 #33
Problem with having calculated fields in the query is the data will very likely not be updateable.
Avatar billede hnteknik Novice
18. januar 2008 - 12:57 #34
Sorry Terry - have no problems in updating or adding dates. Cause - you can only update a calculated field indirectly ;-) Test my view above.
Avatar billede terry Ekspert
18. januar 2008 - 13:35 #35
it works here too, but quite often introducing calculated fields can make the data read only. Are you using Access 2007 by any chance?
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