Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Rechnen mit DateDiff über 00:00 hinaus

Begonnen von Xoar, November 15, 2016, 12:49:23

⏪ vorheriges - nächstes ⏩

Xoar

Hallo,

ich hab mal ne Frage und zwar habe ich ein Hauptformular wo ein Datum ausgesucht wird, im Unterformular werden dann die passenden Daten angezeigt. Jetzt gibt es bei uns die Besonderheit das ich Arbeitszeiten erfassen möchte, diese aber nicht nur von 00:00 bis 23:59 gehen, sondern bis 07:30 am Folgetag.

Die Zeiten werden in ein Von und Bis Feld eingetragen was als Datum in 24Std Formatiert ist, also nur die Uhrzeit eingetragen wird, ohne Datum.

Jetzt rechne ich immer bei den Zeiten 00:00 bis 07:30 (07:30 ist der grundsätzliche Arbeitsschluss) 24 std mit DateAdd dazu. Klappt auch soweit.

Ist es evt besser im Nach aktualisierung Event vom bis Feld mit DateAdd einmal 24 std hinzu zu addieren, dann könnte die DateDiff normal rechnen.
if me!bis between timevalue ("00:00") and timevalue ("07:30") then
me!bis = dateadd ("h", 24, [bis])
End if


Oder

if me!bis <= timevalue ("07:30") then
me!bis = dateadd ("h", 24, [bis])
End if


Grüße

ebs17

#1
Kannst Du 24-Stundendienste (6:00 bis 6:00) oder längere Dienste ausschließen?

Dann könnte es so gehen:
DateDiff("h", vonZeit, bisZeit - (bisZeit < #7:00:00#))
... was man auch in die Abfrage der Formulardatenherkunft einbauen kann.
Mit freundlichem Glück Auf!

Eberhard

Xoar


ebs17

Dann nimm zur Zeit immer das entsprechende Datum dazu, dann kannst Du auch über Wochen saubere Differenzen bilden.
Mit freundlichem Glück Auf!

Eberhard

crystal

Hallo,
soweit ich weiß, ist das Uhrzeit-Format auf Werte zwischen 00:00:00 und 23:59:59 beschränkt. Wenn man also z.B. zu 22:00:00 5 Stunden addiert erhält man 03:00:00 und nicht etwa 27:00:00. Auch wenn man 27 Std addiert, erhält man diesen Wert.
Es bleibt also nichts anderes übrig, als dies in der Berechnung zu berücksichtigen, z.B. mit

dauer = ende - start + (ende <= start)*24


lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Xoar

@Eberhard
Dies wollte ich ja gerade unterbinden, ich wähle ja im HF ein Datum aus und möchte nicht bei allen 30 DS des ufrm auch das Datum dazu auswählen müssen, oder überhaupt sichtbar haben.

@crystal
Mhh ok das wäre ungünstig, teste ich morgen mal. Um die Syntax zu verstehen, die gepostet wurden
Ende  - Start   + (07:30 <= 07:30) JA *24
07:30 - 07:30 + (*24)?

Käme da nicht 0*24 raus?

Oder wie wird das gerechnet

Grüße

ebs17

#6
Zitat24-Stundendienste (6:00 bis 6:00)
Zu welchem Ergebnis kommst Du, wenn Du bei Datumsweglassung Deine Gescheitrechnung anwendest?

Zudem kennt man die reale sowie die mögliche Datenlage nicht:
0:30:00 bis 6:30:00
=> sind die Zeiten vom gleichen Tag oder liegen da eins, zwei, drei Tage dazwischen?

Orientierungsfrage:
ZitatRechnen mit DateDiff über 00:00 hinaus
Wo kommt denn in Deinen Beschreibungen eine Differenzermittlung vor?
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

Hallo,
die Formel sollte so aussehen:
Dauer: ([ende]-[start]-([ende]<=[start]))*24
Der Ausdruck ([ende]<=[start]) liefert einen Wahrheitswert (0 oder -1), Wenn die Bedingung zutrifft muss 1 addiert werden. Da der Wert aber negativ ist (-1) muss als Operator - verwendet werden 2-(-1) = 2+1 = 3. Vor der Multiplikation mit 24 ist noch der Gesamtausdruck in ein Klammerpaar einzuschließen.
Zu beachten wäre noch, dass durch die Multiplikation mit 24 dezimale Stunden entstehen. Und wenn mehr als ein Datumswechsel dazwischen liegt geht das aber nicht mehr.
Hier liegen dann auch Zeitsummen vor und keine Uhrzeiten. Nur Ende und Start sind Uhrzeiten.
Gruß Klaus

crystal

Hallo,
eine Schicht von 7:30 bis 7:30 ist 24 Stunden lang.

7:30 - 7:30 - (7:30 <= 7:30) * 24 ergibt
0 - 1 * 24, also
-24 also
0

Der Vergleich (ende <= start) liefert als Ergebnis False oder True. False wird intern als 0, True als -1 dargestellt, so dass man damit rechnen kann.

Das kann man natürlich auch anders machen, z.B.
dauer = ende - start + wenn(ende <= start;24;0)
oder
dauer = ende - start
if ende <= start then dauer= dauer + 24

---------------------------------------------
So - jetzt habe ich mich selbst ausgetrickst.
Im obigen Beisiel 7:30-7:30 kommt zwar intuitiv 24 Stunden heraus, aber da es 24:00:00 nicht gibt, ändert Access das auf 00:00:00

Und die Formel hat noch einen 2. Fehler: 22:00-02:00 ergibt 20 statt 4.

Richtig wäre

dauer = ende - start - (ende <= start)*24 statt
dauer = ende - start + (ende <= start)*24

(hab ich oben auch abgeändert)

Sorry dafür.

Es bleibt aber das Problem, dass statt 24 Stunden 0 Stunden herauskommt.

So bleibt nur, die Uhrzeiten als Zahl darzustellen und dann damit zu rechnen.

lg
crystal

@ebs17: Bitte unterlasse in Zukunft solche Beleidigungen und weise einfach nur neutral auf den Fehler hin.
ZitatZu welchem Ergebnis kommst Du, wenn Du bei Datumsweglassung Deine Gescheitrechnung anwendest?
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MzKlMu

Hallo,
@crystal
da fehlt noch ein Klammerpaar, sonst wird ja nur der Wahrheitswert multipliziert.
Dauer: ([ende]-[start]-([ende]<=[start]))*24
Dann kommen auch die 24 Stunden raus.
Siehe #7
Gruß Klaus


crystal

Hallo Klaus,
ich glaube, mit deiner Formel liegst du falsch.
Bsp: 22:00 bis 07:00 (sollte also 9 ergeben)

([ende]-[start]-([ende]<=[start]))*24
(07:00 - 22:00 -(-1)) * 24
(-15 +1 ) *24
-14 * 24

Meine Formel hingegen:
[ende]-[start]-([ende]<=[start])*24
07:00 - 22:00 - (-1) *24
-15 + 24
9

OK?

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Josef P.

#12
Hallo!

Falls [start] und [Ende] Datumsfelder sind, stimmt die Formel von Klaus.

1 Tag = 1.0
1 Stunde = Bruchteil eines Tages = 1/24


Die wenigsten Probleme gibt es, wenn man bei Datumsfelder das exakte Datum und nicht den 30.12.1899 als Datumswert verwenden würde.

/edit:

Beispiel:
Dim start As Date
Dim ende As Date

Const DateTimeFormat As String = "\#dd.mm.yyyy hh:nn\#"

start = #11/14/2016 5:00:00 PM#
ende = #11/15/2016 9:00:00 AM#

Debug.Print Format(start, DateTimeFormat); " - "; Format(ende, DateTimeFormat),
Debug.Print Round((ende - start) * 24, 0), DateDiff("h", start, ende)

start = #5:00:00 PM#
ende = #9:00:00 AM#

Debug.Print Format(start, DateTimeFormat); " - "; Format(ende, DateTimeFormat); " nach Korrektur: "; Format(ende - (ende <= start), DateTimeFormat),
Debug.Print Round((ende - (ende <= start) - start) * 24, 0), DateDiff("h", start, ende - (ende <= start))


mfg
Josef

crystal

Hallo,
es geht ja eigentlich um die DateDiff-Funktion.
Die ist so intelligent, Tag(e) zu addieren, wenn als Zeit ein Wert über 24 herauskommt.
Insofern haben Eberhard und Josef (Nachricht wurde leider gelöscht) und Klaus natürlich Recht damit, die Felder um das Datum zu erweitern.

Es ist nur etwas schwer zu begreifen, weshalb man in einer Schichtplanungs-Anwendung immer auch das Datum mit eingeben müsste. Wenn nun in einer Anwendung maximal 24-Stunden-Schichten möglich sind, kann man sich damit begnügen, 00:00 als 24:00 zu interpretieren.
Ansonsten (Schichten > 24 Stunden, wie z.B. in Krankenhäusern oder bei Bereitschaftsdiensten) müsste man eben die Tage mit berücksichtigen. Aber leider gibt es in Access nicht soetwas wie "nächster" oder "übernächster Tag". Ich würde dann eher vorschlagen, im Planungsformular ein Kombifeld "nächster" "übernächster" Tag einzufügen, um damit auch Schichtlängen über 24 Stunden berechnen zu können.

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Josef P.

ZitatEs ist nur etwas schwer zu begreifen, weshalb man in einer Schichtplanungs-Anwendung immer auch das Datum mit eingeben müsste.
Das Eingeben des Datumswertes für den nächsten Tag kann die Clientanwendung dem Anwender abnehmen. Nur weil es in der Tabelle so sein soll, muss das ja nicht bedeuten, dass der Anwender die Uhrzeit mit dem Datum eingeben muss.

mfg
Josef