Access If then else in eine Abfrage einbauen
Hey Leute ich hab da mal eine echt wichtige Frage, denn ich sitz schon 22 Tage dran:
Start End normaltime overtimetime
08:30:00 17:30:00 9 0
15:00:00 20:00:00 5 2,5
08:00:00 14:00:00 6 -3,5
14:00:00 19:00:00 5 1,5
08:30:00 17:30:00 9 0
08:30:00 18:30:00 10 1
44 1,5
Dies ist der ausschnitt meiner Abfrage, in die ich jetzt gern noch eine IF Then Else Anweisung einbauen wollen würde.
Denn Wenn der END Wert über 17:30 wandert, so sollen die Überstunden gezählt werden, klappt bis jetzt ja ganz gut, nur das er auch negative anzeigt, was ich nicht durch eine Bedingung weg bekomme, da sonst auch die normaltime stunden verschwinden. Und splitten der beiden geht nicht, da ein späteres Zusammenfügen nur Ärger gemacht hat.
Meine IF Then Else anweisung soll so aussehen:
normaltime:
If [End] > #17:30#
Then normaltime= Datdiff("n";[Start]; #17:30#)/60
Else normaltime = Datdiff("n";[Start]; [End])/60
wobei hier noch eine weitere verschachtelte if then else rein soll: AND if (datdiff("n";[Start];[End])/60)-1
(-1 wegen der 1nen stunde mittagspause)
overtime:
If [End] <= #17:30#
Then [overtime] = 0
Else Datdiff("n"; #17:30# ; [End])/60
Ich hoffe ihr habt verstanden was ich mein.
Liebe grüße azzido
Antwort schreiben
Antwort 1 von azzido vom 04.09.2019, 08:26 Options
hab ich doch was vergessen:
bei der verschachtelten if then else anwesung muss es natürlich heißen:
if Datdiff("n";[Start]; [End] )/60 > 5,5
(da von 12 bis 13:00Uhr Mittag ist, muss der Else wert der ersten if then else anw. größer als 5,5 Stunden sein) sonst:
Then: Datdiff("n";[Start];[End])/60 -1
Übrigens ist die /60 nur die Einheit um von Minuten auf Std umzurechnen.
Antwort 2 von MixMax vom 04.09.2019, 08:26 Options
hm... *rauch* also versuch doch einfach erstmal eine Spalte zu machen in der die größere Zahl von 0 oder END - #17:30#
So kann die Zahl nicht unter 0 sinken.
eventuell kannst du damit etwas weiterentwickeln:
SELECT zeit.start, zeit.end, CDate(end-start) AS dif, cdate(IIf([end]-#12/30/1899 17:0:0#>0,[end]-#12/30/1899 17:0:0#,0)) AS nach17, cdate(IIf([end]-start > #6:00:0#,#1:0:0#,0)) AS mehr6stdarbeitmittag
FROM zeit;
so - wenn mehr als #6:00:00 kannst du so auch 1:00:00 mittag abgreifen z.B.
Antwort 3 von MixMax vom 04.09.2019, 08:31 Options
nachtrag - rechne nicht in stunden und minuten, das umzurechnen ist zu aufwändig, rechne einfach mit dem Zeitwert für eine stunde #1:00:00# da du sonst 1/24 rechnen must als eine stunde (also Access rechnet ja in Tagen und als nachkommastelle die Uhrzeit)
Antwort 4 von azzido vom 04.09.2019, 08:40 Options
hey danke für die schnelle antwort, doch leider hab ich schon versucht mehrere Spalten daraus zu entwickeln, doch leider hat sich die db immer dabei selbst verarscht, denn einerseits sind dann einige Werte die keine overtime hatten rausgeflogen anderer seits sind manche Werte doppelt vorgekommen, da bei der overtime manchmal dann einfach ein Feld mit einem anderen gefüllt wurde.
Fast vergessen: den Startwert und Endwert gibt aber der Arbeiter von sich aus ein und damit musst ich ein bestimmtes Eingabeformat wählen.
Antwort 5 von MixMax vom 04.09.2019, 08:55 Options
ist start und endwert keine Uhrzeit?
bei der Abfrage kann man natürlich auch einfach die verschiedenen Spalten aufaddieren und als eine Spalte ausgeben lassen. Um damit addieren zu können, ist es aber wichtig, Datum/Zeitformat zu nehmen.
Antwort 6 von azzido vom 04.09.2019, 09:04 Options
End und Startwert sind natürlich Datum und Uhrzeit, doch weiß ich gerade mal gar nicht was du meinst.
sorry wenn ich mich anstelle wie ein Honk, aber ich sitz seit etwa 3 Tagen an der scheiße und hab nur noch ein Hals