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: 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. Problemet är att min kunskaper inte räcker till för att bygga mer avancerade SQl satser. Jag har hjälpt någon med i stort sett samma problem tidigare. Försöker bara hitta tråden... Hej Då klistrar jag in koden från tråden jag hänvisade till: Tackar!!!!! Tala gärna om vilket felmeddelande du fick. Felet blir: 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å. Hur har det gått? Använder du någon av våra lösningar?Räkna ut tid mellan två datum med hänsyn till arbetsdag
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!!!!Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
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é?Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
<b>Edit</b>
Nu hittade jag den: [Beräkna tidsdifferens, med hänsyn till helgdagar och "nätter]Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
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
Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
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
Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
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!!!Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
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-KarinSv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
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 DoubleSv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
Sen kan det finnas mer som ska lusas av.
//Anna-KarinSv: Räkna ut tid mellan två datum med hänsyn till arbetsdag
<%
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"
%>
Sv: Räkna ut tid mellan två datum med hänsyn till arbetsdag