Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-21 14:49:44 - Jonas P Ström, i forum asp - allmänt, Tråden har 12 Kommentarer och lästs av 2827 personer

Jag behöver räkna ut/summera tid mellan två datum där jag vill veta om leverans har skett inom 4 timmar från beställning så att jag får ut statistik enligt:

Inom 4 h 85%
Över 4 h 15%
av totalt 200 leveranser.


Problemet är all tid mellan 18:00 - 08:00 samt helg.
Ex. Nisse beställer kl: 16:00 och får leverans 08:30 nästa dag.
Produkten är levererad inom 4 arbetstimmar men det har gått 16 h sedan beställningen.

Går det att köra en avanceras sql-sats på datediff mellan beställd och levererad som tar hänsyn till natt, helg m.m. eller skall man lägga någon kontroll innan man lägger in datum/tid för leverans??

/Vad är lättast??????
/Snälla hjälp!!!!


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-21 14:56:07 - Pelle Johansson

Om du har tillgång till sql-server för detta kan du skriva user defined functions som kan hjälpa dig avsevärt med detta, men det bör såleds gå med lite if-when-then i sqlfrågan också. Börja med ta reda på hur du skall räkna ut detta genom att kanske skriva ett enkelt vb-program.


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-22 09:02:34 - Jonas P Ström

Problemet är att min kunskaper inte räcker till för att bygga mer avancerade SQl satser.

Jag har början

SQL = "SELECT Count(Levererad.Id) AS AntalLevererad FROM Levererad WHERE Levererad.Status='Klar' AND Levererad.D003 Is Not Null AND DateDiff('n',D001,D003) Between 0 And 240"

D001 = Beställd
D003 = Levererad

men jag vet inte hur jag skall bygga in mer funktioner. Det är nog lättare som du säger att
skriva ett enkelt vb-program - men jag vet inte riktigt hur jag skall komma runt röda dagar/påsk m.m.
någon idé?


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-22 10:42:49 - Per Persson

Jag har hjälpt någon med i stort sett samma problem tidigare. Försöker bara hitta tråden...

<b>Edit</b>
Nu hittade jag den: [Ber&#228;kna tidsdifferens, med h&#228;nsyn till helgdagar och &quot;n&#228;tter]


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-22 14:06:26 - Anna-Karin Söderberg

Hej

Ber om ursäkt över att mitt svar dröjde, var tvungen att fråga om jag fick lämna vidare koden.
Den här koden fick jag och den fungerar. Du ser själv vart du behöver ändra för att det skall fungera så som du vill.

Public Function GetDiff(ByVal dtArrived As Date, ByVal dtReply As Date) As Double
    
    Dim tmStop As Date
    Dim tmStart As Date
    Dim result As Double
    tmStart = "07:00:00" ' tid from detta klockslag skall räknas
    tmStop = "18:00:00" ' tid fram tillochmed detta klockslag skall räknas.
    
    
    
    ' först kollar vi vilken veckodag mailet kom in.
    ' om det är en lördag eller en söndag så hoppar vi fram till måndagen klockan 07:00 och kör därefter vidare
    ' annars kollar vi hur mycket tid som förflutit fram till 18:00 om det skiljer en eller flera dagar och skickar med skillnaden
    
    result = 0
        
    Select Case Weekday(dtArrived, vbMonday)
        Case 1 To 4
            ' nu inkom det någon gång mellan måndag och torsdag
            If FormatDateTime(dtArrived, vbLongTime) < tmStart Then
                ' och nu inkom det före 07:00, då låtsas vi att det inkom 07:00
                dtArrived = FormatDateTime(dtArrived, vbShortDate) & " 07:00:00"
            End If
                
            If FormatDateTime(dtArrived, vbLongTime) > tmStop Then
                ' och nu inkom det efter 18:00, då lägger vi till en dag och låtsas att det inkom 07:00
                dtArrived = DateAdd("D", 1, FormatDateTime(dtArrived, vbShortDate)) & " 07:00:00"
            
            End If
        Case 5
            ' inkom på en fredag
            If FormatDateTime(dtArrived, vbLongTime) < tmStart Then
                ' och nu inkom det före 07:00, då låtsas vi att det inkom 07:00
                dtArrived = FormatDateTime(dtArrived, vbShortDate) & " 07:00:00"
            ElseIf FormatDateTime(dtArrived, vbLongTime) > tmStop Then
                ' och nu inkom det efter 18:00, då låtsas vi att det inkom nästkommande måndag kl 07:00
                dtArrived = DateAdd("D", 3, FormatDateTime(dtArrived, vbShortDate)) & " 07:00:00"
            Else
                'här har det alltså inkommit efter 06 och före 18 på en fredag
                ' då måste vi kolla om det är besvarat samma dag.
                ' är det inte det så måste vi kolla diff mot 18:00 och sedan
                ' hoppa fram till måndag kl 07:00
                If DateDiff("D", dtArrived, dtReply) > 0 Then
                    result = result + DateDiff("N", dtArrived, FormatDateTime(dtArrived, vbShortDate) & " 18:00:00", vbMonday)
                    dtArrived = DateAdd("D", 3, FormatDateTime(dtArrived, vbShortDate) & " 07:00:00")
                End If
            End If
            
        Case 6
            ' nu inkom detta på en lördag, då låtsas vi att det inkom på måndagen efter, klockan 7
            dtArrived = DateAdd("D", 2, FormatDateTime(dtArrived, vbShortDate)) & " 07:00:00"
        Case 7
            ' nu inkom detta på en söndag, då låtsas vi att det inkom på måndagen efter, klockan 7
            dtArrived = DateAdd("D", 1, FormatDateTime(dtArrived, vbShortDate)) & " 07:00:00"
            'Debug.Print "SÖNDAG"
    End Select
    
' Fixa till svarstiden; om vi svarat innan vi borde.......
    Select Case Weekday(dtReply, vbMonday)
        Case 1 To 4
            ' nu inkom det någon gång mellan måndag och torsdag
            If FormatDateTime(dtReply, vbLongTime) < tmStart Then
                ' och nu inkom det före 07:00, då låtsas vi att det inkom 07:00
                dtReply = FormatDateTime(dtReply, vbShortDate) & " 07:00:00"
            End If
                
            If FormatDateTime(dtReply, vbLongTime) > tmStop Then
                ' och nu inkom det efter 18:00, då lägger vi till en dag och låtsas att det inkom 07:00
                dtReply = DateAdd("D", 1, FormatDateTime(dtReply, vbShortDate)) & " 07:00:00"
            
            End If
        Case 5
            ' inkom på en fredag
            If FormatDateTime(dtReply, vbLongTime) < tmStart Then
                ' och nu inkom det före 07:00, då låtsas vi att det inkom 07:00
                dtReply = FormatDateTime(dtReply, vbShortDate) & " 07:00:00"
            ElseIf FormatDateTime(dtReply, vbLongTime) > tmStop Then
                ' och nu inkom det efter 18:00, då låtsas vi att det inkom nästkommande måndag kl 07:00
                dtReply = DateAdd("D", 3, FormatDateTime(dtReply, vbShortDate)) & " 07:00:00"
            Else
            End If
            
        Case 6
            ' nu inkom detta på en lördag, då låtsas vi att det inkom på måndagen efter, klockan 7
            dtReply = DateAdd("D", 2, FormatDateTime(dtReply, vbShortDate)) & " 07:00:00"
        Case 7
            ' nu inkom detta på en söndag, då låtsas vi att det inkom på måndagen efter, klockan 7
            dtReply = DateAdd("D", 1, FormatDateTime(dtReply, vbShortDate)) & " 07:00:00"
            'Debug.Print "SÖNDAG"
    End Select
    
    
    ' nu har vi justerat dtArrived så att vi garanterat befinner oss på en vardag mellan 07:00 och 18:00 med dtarrived
        
    If DateDiff("D", dtArrived, dtReply) < 1 Then
        ' nu är vi alltså i det läget att dtArrived och dtReply är på samma dag
        ' och med ovanstående så har vi garanterat att vi befinner oss någonstans mellan 07:00 och 17:30
        GetDiff = DateDiff("N", dtArrived, dtReply, vbMonday) + result
        Exit Function
    Else
        ' nu har vi konstaterat att det inte är samma svarsdag som mottaget dag, trots justeringarna ovan.
        ' då ska vi in i loopen
        'Debug.Print "***"
        GetDiff = Calculate(dtArrived, dtReply) + result
    End If
    'Debug.Print dtArrived
    Exit Function
    
End Function
 
Private Function Calculate(ByVal dtArrived As Date, ByVal dtReply As Date)
    Dim tmStop As Date
    Dim tmStart As Date
    Dim result As Double
    tmStart = "07:00:00" ' tid from detta klockslag skall räknas
    tmStop = "18:00:00" ' tid fram tillochmed detta klockslag skall räknas.
    
    
    result = 0
    ' först kollar vi hur lång tid det är till klockan 18 samma dag som dtarrived är just nu. =)
    result = result + DateDiff("N", dtArrived, FormatDateTime(dtArrived, vbShortDate) & " 18:00:00", vbMonday)
    ' sedan skall vi löpande lägga till 1 till datumet och kolla om detta är samma dag som reply
    ' om det är det så skall vi räkna tiden från 07:00 den dagen till svaret skickades
    ' om det inte är samma dag så lägger vi till 660 minuter om det är måndag tillochmed fredag och sedan hoppar vi vidare
    ' om det är lördag eller söndag så hoppar vi raskt vidare till måndagen efter utan att lägga till nån tid
    
    Do
        ' hoppa till nästa dag klockan 07:00
        dtArrived = DateAdd("D", 1, FormatDateTime(dtArrived, vbShortDate)) & " 07:00:00"
        
        If DateDiff("D", dtArrived, dtReply, vbMonday) = 0 Then
            ' nu är vi på rätt dag! bara att hämta ut tidsskillnaden i minuter nu.
            result = result + DateDiff("N", dtArrived, dtReply, vbMonday)
            Exit Do
        Else
            ' här ska vi nu avgöra hur mycket tid som skall läggas till till result.
            ' är den aktuella dagen måndag till fredag så lägger vi till 660 minuter (alltså 12 timmar)
            ' är det lördag eller söndag så lägger vi inte till nåt alls
            If Weekday(dtArrived, vbMonday) < 6 Then
                result = result + 660
            End If
        End If
        If DateDiff("D", dtArrived, "2099-12-31", vbMonday) < 1 Then
            MsgBox "Ett fel har uppstått, du loopar runt runt runt. Avbryter..."
            Exit Function
        End If
    Loop
    Calculate = result
End Function


//Anna-Karin


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-22 14:41:13 - Per Persson

Då klistrar jag in koden från tråden jag hänvisade till:

Function min(x As Integer, y As Integer)
   If x < y Then
       min = x
   Else
       min = y
   End If
End Function

Function week(t As Date)
   week = DatePart("WW", t, vbMonday, vbUseSystem)
End Function

Function F(t As Date)
   F = 3600 * week(t) + 720 * min(5, Weekday(t, vbMonday)) + 60 * min(12, Hour(t) - 6) + Minute(t)
End Function

Private Sub Form_Load()
   MsgBox F("2003-09-01 07:00:00") - F("2003-08-29 17:30:00")
End Sub


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-25 11:04:06 - Jonas P Ström

Tackar!!!!!

Jag skall testa och återkomma!

Tack igen för all input.


Anna-karin & Per
Jag har testat bägge men jag måste missa något då jag får kompilerings fel.
---------------
Kompileringsfel i Microsoft VBScript (0x800A0401)
Slut på programsats förväntas.
---------------

Jag är för trött för att tänka idag - tung helg :-)
+ plus att detta är överkurs för mig!!!


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-25 11:43:39 - Anna-Karin Söderberg

Tala gärna om vilket felmeddelande du fick.

Jag kör den där koden men då i VB och där fungerar den, fast jag har stökat om den.
Men du kör ju fasta tider så du ska inte behöva ändra i koden.


//Anna-Karin


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-25 11:49:57 - Jonas P Ström

Felet blir:

Kompileringsfel i Microsoft VBScript (0x800A03EE)
')' förväntas.
/snippets/D001.asp, line 15, column 40
Public Function GetDiff(ByVal dtArrived As Date, ByVal dtReply As Date) As Double


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-25 12:26:40 - Anna-Karin Söderberg

Ska se om jag kan sätta mig och avlusa den där koden, tänkte inte på att ASP inte deklarerar sina variabler. ByVal ska bort och sen tror jag att man får plocka ner det och göra om det till datum inne i koden. As Double ska bort också.

Sen kan det finnas mer som ska lusas av.


//Anna-Karin


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-25 13:12:53 - Per Persson

<%

Function min(x, y)
   If x < y Then
       min = x
   Else
       min = y
   End If
End Function

Function week(t)
   week = DatePart("WW", t, vbMonday, vbUseSystem)
End Function

' Under vardagar skall tid mellan 18:00 och 08:00 nästkommande dag inte räknas med.
' Under helger (lördag och söndag) skall ingen tid räknas.
Function F(t)
'   Const StartDayHour = 8
'   Const EndDayHour = 18
'   Const WorkHoursPerDay = EndDayHour - StartDayHour
'   Const WorkDaysPerWeek = 5
'   Const MinutesPerHour
'   F = MinutesPerHour * (WorkHoursPerDay * (WorkDaysPerWeek * week(t) + min(WorkDaysPerWeek, Weekday(t, vbMonday))) + min(WorkHoursPerDay, Hour(t) - StartDayHour)) + Minute(t)

'  Det aktuella fallet förenklat:
   F = 3000 * week(t) + 600 * min(5, Weekday(t, vbMonday)) + 60 * min(10, Hour(t) - 8) + Minute(t)
End Function

starttime = "2003-08-29 16:30:00"
endtime = "2003-09-01 09:00:00"

Response.Write "Mellan " & starttime & " och " & endtime & " har förflutit " & _
        F(endtime) - F(starttime) & " minuter arbetstid"

%>


Svara

Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag

Postades av 2004-10-30 15:29:01 - Per Persson

Hur har det gått? Använder du någon av våra lösningar?


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 645
27 953
271 710
12 058
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies