PDA

Vollständige Version anzeigen : Nachtschicht aus Zeitstempel


Volker S.
27.04.2011, 13:35
Hallo,
in einer Tabelle sind u.a. fortlaufende ca. alle 30 sek. Zeitstempel und Druckverläufe abgespeichert, welche von einer Automatisierungsvorrichtung kommen.
Nun sollen anhand dieser Einträge via Abfrage die Mittelwerte der Drücke u.a. nach Schichten gruppiert werden (Früh, Spät, Nacht) um Tendenzen erkennen zu können. An sich ja kein Problem...
...außer bei der Nachtschicht.

Wie bekomme ich es hin, dass hier die Werte vom z.B: 01.04.2011 22:00 Uhr bis 06:00 gruppiert werden und nicht die vom 02.04.2011 00:00 Uhr bis 02.04.2011 06:00 Uhr und 02.04.2011 22:00 bis 23:59 Uhr?
:confused:

Atrus2711
27.04.2011, 13:48
Hi,

ermittle die Stunden-Teile der Zeitstempel, und baue eine Tabelle auf, die festhält, von wieviel bis wieviel Uhr die 3 Schichten gehen:

SchichtID VonZeit BisZeit
1 06:00 13:59
2 14:00 21:59
3 22:00 05:59


Dann kannst du in einer Abfrage die Zeit-Teile in die Schichten einsortieren:
SELECT Daten.*, Schichtgrenzen.ID
FROM Daten INNER JOIN Schichtgrenzen
ON
Daten.Zeitteil >= Schichtgrenzen.VonZeit AND
Daten.Zeitteil <= Schichtgrenzen.BisZeit

Marsu65
27.04.2011, 14:07
@Martin
Daran hatte ich auch gedacht. Dabei würden aber die Datumsangaben verloren gehen? z.B. müsste ja ein Druck am 20.01.2011 um 05:00 der Nachtschicht vom 19.01.2011 zugeordnet werden.

Ich würde eine Funktion einsetzen, die eine Zuordnung (Datum, F/S/N) zurückgibt nach der sich gruppieren lassen würde.

@Volker
Ein paar Spieldaten (Acc00) wären nicht schlecht.

Volker S.
27.04.2011, 14:11
Hallo Martin,
danke für deine schnelle Hilfe.

Das Problem stellen nicht die Zeiten an sich dar, sondern der Tageswechsel während der Nachtschicht. Hier werden bei der Nachtschicht ja auch wieder die Zeitspannen eines Tages hergenommen. Die Zeit von 00:00 bis 05:59 am 02.04. müsste ja eigentlich dem Vortag (01.04) zugeordnet werden. Irgendwie... so einen 30 Std.-Tag.
;)


IIf(Format([Feld01],"Short Time") Between "00:00" And "05:59","Nacht", _
IIf(Format([Feld01],"Short Time") Between "22:00" And "23:59","Nacht", _
IIf(Format([Feld01],"Short Time") Between "06:00" And "13:59","Früh", _
IIf(Format([Feld01],"Short Time") Between "14:00" And "21:59","Spät")))) _
AS Schicht


So hab ich es halt jetzt gemacht, aber da passt eben die Nachtschicht nicht, da hier die Daten von dem selben Tag hergenommen werden.

Irgend eine Idee?

Atrus2711
27.04.2011, 14:15
Hi,

der Datumsteil steht ja noch zur Verfügung. Und der Datumsteil des Beginns sollte ja doch den Tag bestimmen, dessen Schichteinteilung dann über die Stundentabelle erfolgt.

Volker S.
27.04.2011, 14:24
Ha,
ich habs!


IIf(Format([Feld01],"Short Time") Between "00:00" And "05:59",Format([Feld01]-1,"dd/mm/yyyy") & " - Nacht", _
IIf(Format([Feld01],"Short Time") Between "22:00" And "23:59",Format([Feld01],"dd/mm/yyyy") & " - Nacht", _
IIf(Format([Feld01],"Short Time") Between "06:00" And "13:59",Format([Feld01],"dd/mm/yyyy") & " - Früh", _
IIf(Format([Feld01],"Short Time") Between "14:00" And "21:59",Format([Feld01],"dd/mm/yyyy") & " - Spät")))) _
AS Schicht


Danke für eure Hilfe!

Marsu65
27.04.2011, 14:48
ich habs
Zum Nachdenken:
Was passiert mit den Daten um 21:59:30 ?

Marsu65
27.04.2011, 15:25
Entsprechende Genauigkeit ließe sich z.B. mit dieser Funktion erreichen:Function Schichtzuordnung(ByVal DT As Date) As String

Dim dDT As Double 'Datum/Zeit als Zahl
Dim lDate As Long 'Datum-Teil als Zahl
Dim sTime As Single 'Zeit-Teil as Zahl

dDT = CDbl(DT)
lDate = Fix(DT)
sTime = dDT - lDate
Select Case sTime
Case Is < 6 / 24 'Nachtschicht Vortag
Schichtzuordnung = Format(DT - 1, "dd.mm.yy") & " Nachtschicht"
Case Is < 14 / 24 'Frühschicht selber Tag
Schichtzuordnung = Format(DT, "dd.mm.yy") & " Frühschicht"
Case Is < 22 / 24 'Spätschicht selber Tag
Schichtzuordnung = Format(DT, "dd.mm.yy") & " Spätschicht"
Case Else 'Nachtschicht selber Tag
Schichtzuordnung = Format(DT, "dd.mm.yy") & " Nachtschicht"
End Select
End Function

Volker S.
28.04.2011, 05:53
Hallo Marsu,
danke für deine Hilfe.

Die Zeit wird doch ins kurze Format umgewandelt. Damit sollte das Problem doch hinfällig sein. Oder täusche ich mich hierbei? Ansonsten müsste anders formatiert (hh:mm:ss) werden und die Sekunden müssten mit in die Zeiteingrenzung (14:00:00 bis 21:59:59).

Von einer VBA-Funktion wollte ich in diesem Fall eigentlich absehen, da ich hier in Verbindung mit Querys eher schlechte Erfahrungen hinsichtlich der Abfragegeschwindigkeit gemacht habe.

Aber trotz alledem ist dein Vorschlag super. Den werde ich auf jeden Fall an anderer Stelle einsetzten können.

Danke!

ebs17
28.04.2011, 09:29
Von einer VBA-Funktion wollte ich in diesem Fall eigentlich absehen, da ich hier in Verbindung mit Querys eher schlechte Erfahrungen hinsichtlich der Abfragegeschwindigkeit gemacht habe.
Da kommt es sicher auf die konkrete Verwendung an.
Der gezeigte IIf-Format-Ausdruck wird, wenn er zum Gruppieren verwendet wird, ebenso eine Nutzung von einem Index unterbinden wie eine einfache VBA-Funktion oder eine userdefinierte Funktion. Aus ist aus.
Und Indexnutzung ist nun einmal bei gegebenen Datenmengen das Performancekriterium Nummer 1 (je nach Gestaltung kann der Faktor für einen Unterschied durchaus 3- bis 4-stellig ausfallen).

Die Funktion von Marsu hat jedenfalls den Charme, deutlich besser lesbar (und erweiterbar) zu sein als der geschachtelte IIf-Block.

Marsu65
28.04.2011, 10:54
Die Zeit wird doch ins kurze Format umgewandelt. Damit sollte das Problem doch hinfällig sein.
Hast recht. Ich hatte, ohne es zu testen, unberechtigterweise auf "Rundungsfehler" seitens Access spekuliert.

Von einer VBA-Funktion wollte ich in diesem Fall eigentlich absehen, da ich hier in Verbindung mit Querys eher schlechte Erfahrungen hinsichtlich der Abfragegeschwindigkeit gemacht habe.

Wenn wie, Eberhard schon bemerkte, eine Indexnutzung eh unterbunden wird verwende ich wg. der Übersichtlichkeit lieber eine kleine Funktion. Das mag aber Geschmackssache sein ;)

Da dein Problem ja auf jeden Fall gelöst scheint, wäre es nett, wenn du den Thread als ERLEDIGT kennzeichnest.