Access-o-Mania

Access-Forum (Deutsch/German) => Access-Hilfe => Thema gestartet von: Xoar am November 15, 2016, 12:49:23

Titel: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Xoar am November 15, 2016, 12:49:23
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: ebs17 am November 15, 2016, 16:30:36
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.
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Xoar am November 15, 2016, 16:42:14
Nein, 24er ist die Regel.
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: ebs17 am November 15, 2016, 17:41:33
Dann nimm zur Zeit immer das entsprechende Datum dazu, dann kannst Du auch über Wochen saubere Differenzen bilden.
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 15, 2016, 17:56:37
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Xoar am November 15, 2016, 18:19:32
@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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: ebs17 am November 15, 2016, 19:39:03
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?
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: MzKlMu am November 15, 2016, 19:42:33
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.
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 15, 2016, 19:57:39
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?
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: MzKlMu am November 15, 2016, 20:05:01
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Josef P. am November 15, 2016, 20:19:57
[gelöscht / hat Klaus schon geschrieben]
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 15, 2016, 20:21:41
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Josef P. am November 15, 2016, 20:25:56
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 15, 2016, 20:38:57
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Josef P. am November 15, 2016, 20:53:53
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
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 15, 2016, 21:27:06
Hallo Josef,
im Prinzip ja.
Aber es ist schon etwas "merkwürdig", wenn ich auf ein Feld "Uhrzeit bis" klicke und dann als Vorgabe "15.11.2016 21:10:00" erhalte.
Und so müsste ich das Eingabefeld ja formatieren.

Angenehmer und intuitiver wäre es doch, in einem "Uhrzeit bis"-Feld als Vorgabe schlicht "21:10" zu erhalten und ggf. ein weiteres Feld, z.B. auch ein Optionsfeld, mit "nächster Tag" zu bestätigen.

Wenn du das Datum per VBA vorgeben möchtest, gäbe es durchaus einige Probleme, z.B. Datum liegt in der Vergangenheit, Datum liegt mehr als x Tage nach dem Start-Termin usw.

Da wäre meine Variante von der Bedienbarkeit her doch erheblich eleganter und verständlicher, besonders wenn ich daran denke, dass ein solches Planungs-Formular z.B. für die folgenden 4 Wochen gelten soll und daher einfach nur die Tage Mo bis So darstellt - egal welchen Datums. Und genau das ist der Knackpunkt: wenn ich einen Schichtplan erstelle, ist das konkrete Datum zweitrangig, ich orientiere mich eher an Wochentagen.

Nur so Gedanken zur Ergonomie der Oberfläche...

lg
crystal
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Xoar am November 15, 2016, 21:50:00
Ui da kam ja schon gut was zusammen.

Also die Felder sind Datumsfelder, also 30.12.1899 + hh:mm

Es gibt maximal einen Datumswechsel, der von 07:30 bis 07:30 und zwar genau ein Tag. Nie mehr.

Also am Ende reichen mir Zeitsummen.

Ich teste dann morgen mal etwas rum.

Im Eingabeformular habe ich tatsächlich einfachhalt halber hh:mm formatiert
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: ebs17 am November 15, 2016, 22:03:03
Zitatund zwar genau ein Tag. Nie mehr.
Wenn ein Maximaldienst von 24 Stunden, dafür kein 0-Stunden-Dienst möglich ist, könntest Du den Vorschlag aus der allerersten Antwort aufgreifen, indem das "<" durch ein "<=" ersetzt wird.
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Josef P. am November 15, 2016, 22:52:04
Hallo!

ZitatAber es ist schon etwas "merkwürdig", wenn ich auf ein Feld "Uhrzeit bis" klicke und dann als Vorgabe "15.11.2016 21:10:00" erhalte.
Und so müsste ich das Eingabefeld ja formatieren.
Warum musst du das so formatieren? Ich muss das nicht. ;)
Beispiel: http://access.joposol.com/download/Uhrzeiteingabe.zip

mfg
Josef
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: MzKlMu am November 15, 2016, 23:23:26
Hallo,
@Cristal
nein, meine Formel ist richtig und liefert von 22:00 - 7:00 die richtigen 9 Stunden.
Du hast den Datentyp Datum/Uhrzeit noch nicht richtig verstanden.
Die Uhrzeit ist intern eine Zahl (<1) des Typs Double.
12:00 = 0,5
Wenn Du also mit meiner Formel rechnen willst, muss die Zeit erst mal in eine Kommazahl gewandelt werden. Du darfst nicht mit den absoluten Stundenwerten rechnen das wird falsch.
22:00 = 0,916666666
07:00 = 0,291666666
Access rechnet intern mit diesen Kommazahlen.
Jetzt lösen wir die Formel von innen nach außen auf.
Ende       -     Start
0,291666666 - 0,916666666 = - 0,624999999

Da Ende kleiner ist als Start erhalten wir den Wahrheitswert - 1 der mit - suptrahiert wird und so zu plus wird.
Somit haben wir
- 0,624999999 + 1 = 0,375
Und dieser Gesamtausdruck muss in der Gesamtformel geklammert werden und mit 24 multipliziert.
0,375 * 24 = 9
Somit haben wir die richtigen 9 Stunden.

Noch was zum Datum. Ein Datum mit Zeit ist wie gesagt eine Zahl des Typs Double. Der Teil nach dem Komma ist der dezimale Anteil eines Tages. 12:00 = 0,5, siehe oben. Die Zeit haben wir oben behandelt.
Das Datum ist die Zahl vor dem Komma beginnend mit der Zahl 1 das ist der 31.12.1899. Die Zahl vor dem Komma wird daher immer als Datum interpretiert.
Wenn man jetzt Stunden addieren will z.B. 9+8+7+6 so wird intern so gerechnet:
0,375+0,333+0,291+0,25=1,25 * 24 = 30 Stunden.
Da hier vor dem Komma eine 1 steht wird das als Datum interpretiert und als 31.12.1899 06:00:00 dargestellt. Wenn man jetzt eine solche Zeitsumme (1,25) mit einem Zeitformat belegt wird 06:00 angezeigt was als Uhrzeit richtig ist aber als Zeitensumme falsch.
Die 30 Stunden müssen also mit einer eigenen Funktion (da ist einiges zu finden) als 30:00 dargestellt werden.

Wenn man den Datentyp Datum/Zeit mal verstanden hat, kann man damit völlig problemlos rechnen.

Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 16, 2016, 12:33:45
Hallo Klaus,
ich habe meine Formel in einem einfachen Formular getestet (s. Bild). Die ersten beiden Felder sind Eingabefelder, die anderen werden beechnet. Das Format der Felder habe ich angegeben.

Mit diesem Formular klappt die Berechnung und bei der numerischen Variante kommt als Ergebnis auch 24 heraus, wenn beide Zeiten gleich sind.

Liegt es daran, dass meine Felder ungebunden sind und somit als Datentyp nicht Datum/Zeit haben, sondern vermutlich Text?

lg
crystal

Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: MzKlMu am November 16, 2016, 13:43:40
Hallo,
ich habe Deine Formel nicht getestet, ich wollte nur erklären, warum meine Formel richtig rechnet, da Du deren Richtigkeit angezweifelt hast.
Und dabei bin ich noch näher auf den Datentyp "Datum/Uhrzeit" eingegangen.
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 16, 2016, 13:51:24
Hallo Klaus,
ich wollte auch nicht rechthaberisch sein, sondern nur zeigen, dass ich eine andere Testumgebung gebaut hatte.

Deine Erklärungen des Datum/Zeit-Feldtyps finde ich übrigens sehr gut!

lg
crystal
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: MzKlMu am November 16, 2016, 14:03:54
Hallo,
OT
ZitatDeine Erklärungen des Datum/Zeit-Feldtyps finde ich übrigens sehr gut!
siehst Du, geht doch. Wozu willst Du dann eine extra Bewertungsmöglichkeit.
Das ist doch jetzt bewertet genug.  ;D
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: crystal am November 16, 2016, 14:20:57
<OT>
Hallo Klaus,
nach reiflicher Überlegung bin ich zu dem Schluss gekommen, dass du absolut Recht hast. Eine Bewertung, auch wenn sie einer strikten Vorgabe folgen würde, ist eine zufällige Sache, selbst dann, wenn man jeden Leser "zwingen" würde, eine Bewertung abzugeben. Aber das wäre natürlich Unfug.

Du hast mich mit deinen Argumenten überzeugt und umgestimmt.

lg
crystal
</OT>
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Xoar am November 16, 2016, 14:42:42
Ich danke euch allen, habe selbst viel dazu gelernt!
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: Xoar am Januar 05, 2017, 19:44:57
Hallo,
muss das Thema noch einmal kurz ins Gedächtnis rufen.

Bin jetzt zu dem Entschluss gekommen mit dem kompletten Datum zu rechnen, sprich Datum und Zeitanteil.
Kann ich übrigens nach langen hin und her, nur jedem empfehlen.
Die Folgeberechnung für alles mögliche reduzieren sich immens im Umfang dadurch ;)

So jetzt zum eigentlichen Problem.
In dem Beispiel von Josef gibt es ein Eingabefeld im hh:nn Format und dann ein Feld welches in tt.mm.jjjj hh:nn Format das Datum in der Tabelle speichert.

Habe das für mich selbst umgebaut, klappt auch super.
Ich habe aber das Problem, dass ich vordefinierte Zeiten habe, sprich diese schon in der Tabelle eingetragen sind und beim öffnen des Formulars (Endlosformular) sollen nun in dem ungebundenen Feld was in hh:nn formatiert ist die voreingetragenen Zeiten dargestellt werden, aber auch noch bearbeitbar sein.

wenn ich das ungebundene mit Steuerelementinhalt =[von] schreibe, zeigt er mir zwar hh:nn an, aber sobald ich was ändern will, erschein das Datum UND die Zeit, dies sollte ja nicht passieren. mit =Timevalue([von]) kann ich das Feld nicht mehr bearbeiten.

hab das jetzt so gelöst, dass ich in der Tabelle die hh:nn Zeiten habe UND die tt.mm.jjjj hh:nn Zeiten.
Sobald ich das Feld im hh:nn Format ändere, ändert über VBA auch das andere Feld mit dem kompletten Datumsanteil, womit ich dann rechne.

Ist zwar eine pragmatische Lösung, aber garantiert nicht die Beste.
Man schon wieder viel Text und umständlich erklärt *sorry*

Kurzversion:
Ungebundenes Feld im Endlosformular soll beim öffnen, nur den Zeitanteil von [von] anzeigen und bearbeitbar sein -> nach Eingabe soll [von] den neuen Zeitanteil vom ungebundenen Feld übernehmen.

Grüße
Titel: Re: Rechnen mit DateDiff über 00:00 hinaus
Beitrag von: MzKlMu am Januar 05, 2017, 23:36:40
Hallo,
wenn schon Datum und Zeit würde ich getrennte Felder verwenden, also 4 Felder gesamt. DatumVon, ZeitVon, DatumBis, ZeitBis. Alle Felder sind dann gebunden und können natürlich auch bearbeitet werden. Auch mit dem Format.
Datum und Zeit kann man ganz einfach addieren und kann damit rechnen.
Z.B. in einer Abfrage:
Dauer: (DatumBis + Zeitbis) - (DatumVon + ZeitVon)
Ergibt eine dezimale Dauer in Tagen, also z.B. 2,33 Tage.
Den Gesamtausdruck mit 24 multipliziert ergibt Dauer in dezimalen Stunden.
Oder mit 1440 multipliziert ergibt dezimale Minuten.