Avatar billede fiskerendk Nybegynder
23. april 2014 - 12:42 Der er 9 kommentarer og
1 løsning

Datediff over flere dage

Hej,

Jeg skal lave et script som får et input med en tid fra og til

f.eks. 27-02-2014 22:00:00 til 29-02-2014 03:00:00.

I den forbindelse vil jeg gerne have et script som kan regne ud hvor mange timer pr dag der er i mellem. Det er sådan set nemt nok med DateDiff over hele perioden altså DateDiff("n", startDato, slutDato) så finder den antal minutter i mellem.

Men jeg ville gerne om muligt at den til at regne ud at den. 27-02-2014 er der 2 timer altså fra 22:00-00:00 og d. 28. er der 24 timer og den 29. er der 3 timer fra 00:00 til 03:00.

Jeg er bare gået lidt istå med hvor jeg skal starte.
Har rodet lidt med følgende men kan ikke rigtig genenmskue hvordan jeg bedst kan gribe det an:

iDateDiff = DateDiff("d", startDato, slutDato)
For iDate = 0 to iDateDiff
iDay = Day(DateAdd("d", iDate, CDate(startDate)))

Next

Med Venlig Hilsen
Thomas Nissen
Avatar billede supertekst Ekspert
23. april 2014 - 13:34 #1
Hvor store datointervaller kan der være tale om?
Avatar billede fiskerendk Nybegynder
23. april 2014 - 13:39 #2
Som oftest vil det være over 2 dage altså fra før midnat til lidt efter midnat. men det kan også være op til ca. en uge.
Avatar billede supertekst Ekspert
23. april 2014 - 13:43 #3
ok - det må være muligt - forsøger i en ledig stund..
Avatar billede claes57 Ekspert
23. april 2014 - 13:49 #4
iDage = DateDiff("d", startDato, slutDato) -1
iTimer = 24 - datepart("h",startdato) + datepart("h",slutdato)
' der er iDage døgn og iTimer timer fra startdato/tid til slutdato/tid, fx 1 døgn og 7 timer fra 15/4/2000 23:00 til 17/4/2000 06:00
Avatar billede softspot Forsker
23. april 2014 - 14:34 #5
Her er en lidt mere omstændig rapporteringsmetode (end den claes57 skitserer):


<%
    Server.ScriptTimeout = 5

    class DagSpecifikation
        public Dato
        public Timer
    end class

    function findTimerPrDag(fraDato, tilDato)
        dim liste, naesteDag, aktuelDag, dagSpec

        liste = Array()

        ' find næste dato
        aktuelDag = fraDato

        do while tilDato > aktuelDag
            if Abs(DateDiff("d", tilDato, aktuelDag)) > 0 then
                naesteDag = DateValue(DateAdd("d", 1, aktuelDag))
            else
                naesteDag = tilDato
            end if

            timerTilNaesteDag = DateDiff("h", aktuelDag, naesteDag)

            redim preserve liste(ubound(liste) + 1)
            set liste(ubound(liste)) = NyDagSpec(aktuelDag, timerTilNaesteDag)

            aktuelDag = naesteDag
        loop

        findTimerPrDag = liste
    end function       

    function NyDagSpec(dato, timer)
        dim dagSpec
        set dagSpec = new DagSpecifikation
        dagSpec.Dato = DateValue(dato)
        dagSpec.Timer = timer

        set NyDagSpec = dagSpec
    end function
%>
<!DOCTYPE html>
<html>
    <head>
        <title>Find timer pr. dag i datointerval</title>
    </head>
   
    <body>
        <p>Finder antal timer pr. dag i et datointerval</p>
<%
   
    Dump(findTimerPrDag("27-03-2014 17:00:00", "27-03-2014 23:00:00"))
    Dump(findTimerPrDag("27-03-2014 22:00:00", "29-03-2014 23:00:00"))
   
    sub Dump(timerPrDag)               
        dim dag, endelse
        Response.Write "Viser data for datointervallet: " & timerPrDag(0).Dato & " til " & timerPrDag(ubound(timerPrDag)).Dato & "<br>"
       
        for each dag in timerPrDag
            endelse = ""
            if dag.Timer <> 1 then endelse = "r"
            response.Write dag.Dato & ": " & dag.Timer & " time" & endelse & "<br>"
        next   

        response.Write "<br><br>"
    end sub
%>
    </body>
</html>
Avatar billede claes57 Ekspert
23. april 2014 - 14:49 #6
en lille detalje hvis sluttid er senere end starttid:
iDage = DateDiff("d", startDato, slutDato) -1
iTimer = 24 - datepart("h",startdato) + datepart("h",slutdato)
if iTimer>23 then
  iDage = iDage+1
  iTimer = iTimer-24
end if
' der er iDage døgn og iTimer timer fra startdato/tid til slutdato/tid, fx 1 døgn og 7 timer fra 15/4/2000 23:00 til 17/4/2000 06:00
' også korrekt fra 15/4/2000 20:00 til 17/4/2000 22:00 (2 døgn og 2 timer)
Avatar billede fiskerendk Nybegynder
24. april 2014 - 13:26 #7
claes57 > Det giver desværre kun hvor mange dage og hvor mange timer. Men ellers mange tak for forsøget.

Jeg har nu modficeret softspots code så den passer til mit projekt og det ser rigtig godt ud så jeg takker.
softspot > Hvis du lige smider et svar så kan du få nogle points tak.
Avatar billede claes57 Ekspert
24. april 2014 - 13:40 #8
skulle det være kun i timer?
efter
  end if
en linje mere
  iTimer = iTimer + 24*iDage

det behøver ikke være så svært igen...
Avatar billede softspot Forsker
24. april 2014 - 15:12 #9
Velbekomme :-)
Avatar billede fiskerendk Nybegynder
24. april 2014 - 15:20 #10
claes57 > det var fordi jeg skulle bruge hvor mange timer pr. dag.  Sådan at hvis jeg havde et aftale f.eks. der startede kl. 22:00 og sluttede kl 03:00.

Så ville jeg have et array hvor der ville stå:
21-04-2014 = array[0] = 2 timer
22-04-2014 = array[1] = 3 timer

Eller hvis det var over 3 dage ville det være
21-04-2014 = array[0] = 2
22-04-2014 = array[1] = 24
23-04-2014 = array[2] = 3

Men mange tak alligevel.
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

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