Uhrzeit ohne Sekunden

Moderator: ModerationP

Uhrzeit ohne Sekunden

Beitragvon Gast » 25. Jun 2022, 13:07

Hallo,
wie kann man in einem Tabellenfeld Uhrzeit das Datum als hh:mm speichern?
Aus einem früheren Formular stammen Werte wie 14:34:55, also mit Sekunden.
Durch den Format-Schalter im Formular bekommt man zwar die Anzeige als 14:34, aber für Berechnungen wäre es besser, die Sekunden nicht im Tabellenfeld zu haben. Außerdem irritiert, wenn man in das Formularfeld klickt, dass die Zeit wieder mit den Sekunden erscheint.
Wie erreicht man das? Das Aufrunden ist dann noch ein weiteres Problem: 14:34:55 zu 14:35.
Gruß Karl
Gast
 

Re: Uhrzeit ohne Sekunden

Beitragvon KlausMz » 25. Jun 2022, 16:28

Hallo,
interessante Frage.
14:34:55 zu 14:35.

Und was hättest Du gern bei 14:34:25 auch 14:35 ?
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Uhrzeit ohne Sekunden

Beitragvon Gast » 25. Jun 2022, 18:42

Hallo,
was hättest Du gern bei 14:34:25 auch 14:35 ?

bei 14:34:25 dann 14:34
also <=29s die Sekunden ignorieren; bei =>30s 1 Minute drauf rechnen

Und kann man überhaupt sicherstellen, dass im Tabellenfeld keine Sekunden stehen?
Ich habe das schon mit einer Gültigkeitsregel versucht, aber hh:mm wird immer mit Anf.zeichen ergänzt.
Gruß Karl
Gast
 

Re: Uhrzeit ohne Sekunden

Beitragvon KlausMz » 25. Jun 2022, 19:19

Hallo,
erstelle eine kleine VBA Funktion:
Code: Alles auswählen
Public Function ZeitRunden(Zeit As Date) As Date
    If DateDiff("s", Format(Zeit, "hh:nn"), Zeit) >= 30 Then
        ZeitRunden = DateAdd("n", 1, Format(Zeit, "hh:nn"))
    Else
        ZeitRunden = Format(Zeit, "hh:nn")
    End If
End Function

Die Funktion kannst Du in einer Aktualisierungsabfrage verwenden um bei bestehenen Datensätzen die Zeit zu ändern.
Die Funktion kann auch im Formularfeld im Ereiegnis "Nach Aktualisierung" verwendet werden um Sekundeneingaben zu verhindern.
Wenn die Zeit automatisch gesetzt wird, muss die Funktion dort untergebracht werden.
Das Feld ist auf das Format "hh:nn" (nn ist richtig) einzustellen. Ein Eingabeformat sind hier unbrauchbar.

Wenn Du nicht klar kommst bitte melden.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Uhrzeit ohne Sekunden

Beitragvon Gast » 25. Jun 2022, 20:01

Wie wäre es mit Runden(Uhrzeit*1440;0)/1440 ?
Gast
 

Re: Uhrzeit ohne Sekunden

Beitragvon KlausMz » 25. Jun 2022, 22:33

Oder so. :badgrin:
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Uhrzeit ohne Sekunden

Beitragvon EinGast » 26. Jun 2022, 06:25

Hallo Gast Karl
Gast hat geschrieben:Und kann man überhaupt sicherstellen, dass im Tabellenfeld keine Sekunden stehen?
Ich habe das schon mit einer Gültigkeitsregel versucht, aber hh:mm wird immer mit Anf.zeichen ergänzt.

Wenn bei den vorhandenen Daten mittels Aktualisierungsabfrage die Sekunden entfernt wurden, und zukünftige Eingaben oder Änderungen automatisch gerundet werden (Lösung von KlausMz oder Gast), würde ich zur Sicherheit trotzdem anschließend eine Gültigkeitsregel in der Tabelle beim betreffenden Feld hinterlegen, damit generell bei zukünftige Datenerfassungen oder -änderungen per Eingabe, SQL oder VBA die Sekunden-Eingabe verhindert würde.

Gültigkeitsregel in der Tabelle beim Feld (erst eintragen und speichern, wenn bei allen bestehenden Daten die Sekunden entfernt wurden):
Code: Alles auswählen
Sekunde( [DeinUhrzeitFeldname] ) = 0

oder wenn das Feld auch leer bleiben darf:
Code: Alles auswählen
Sekunde( [DeinUhrzeitFeldname] ) = 0 Oder Ist Null

[DeinUhrzeitFeldname] muss durch den tatsächlichen Feldnamen ersetzt werden.

Und ev. auch eine Gültigkeitsmeldung eintragen, z. B. Sekunden-Eingabe ist nicht erlaubt!

mfg
EinGast
EinGast
 

Re: Uhrzeit ohne Sekunden

Beitragvon knobbi38 » 26. Jun 2022, 10:18

Hallo,

Round() liefert nicht das gewünschte Ergebnis!
Code: Alles auswählen
s = cdate(#11:27:30#) : ? cdate(round(s*1440,0)/1440)
11:28:00
s = cdate(#11:28:30#) : ? cdate(round(s*1440,0)/1440)
11:28:00
s = cdate(#11:29:30#) : ? cdate(round(s*1440,0)/1440)
11:30:00

Round() macht "Bankers Rounding", rundet also so, daß das letzte Digit gerade wird!

Alternativ Round2():
Code: Alles auswählen
s = cdate(#11:28:30#) : ? cdate(round2(s*1440,0)/1440)
11:29:00
s = cdate(#11:29:30#) : ? cdate(round2(s*1440,0)/1440)
11:30:00


mit Round2():
Code: Alles auswählen
Public Function Round2(ByVal Number As Double, ByVal Digits) As Double
  ' Numbers < 0.5 are rounded down
  ' maximum accuracy 13 digits and only for positive numbers!
  '
  Const k As Double = 0.5000000000001

  Dim pow10 As Double
  pow10 = 10 ^ Digits
  Round2 = Int(Number * pow10 + k) / pow10
End Function


Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4314
Registriert: 02. Jul 2015, 14:23

Re: Uhrzeit ohne Sekunden

Beitragvon KlausMz » 26. Jun 2022, 10:44

Hallo,
so gesehen, ist dann meine Version doch nicht so schlecht. Da kann man ohne lange zu probieren die Grenze zum Runden (>= 30) direkt angeben.
Und zur einmaligen Anwendung in einer Aktualisierungsabfrage sowieso.

Und für zukünftige Daten die oben vorgeschlagene Gültigkeitsregel.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Uhrzeit ohne Sekunden

Beitragvon Gast » 26. Jun 2022, 15:00

LOL, ich habe es nur in Excel kurz probiert, wo es funktioniert. Nette Falle von Access :badgrin:
Also eigenes Runden, z.B. hier, aber für diesen Spezialfall ist KlausMz' Funktion dann besser.
Gast
 

Re: Uhrzeit ohne Sekunden

Beitragvon knobbi38 » 26. Jun 2022, 15:22

Hallo Klaus,

hier mal eine Funktion, deiner Version etwas nachempfunden, die auch mit einem Datumsanteil umgehen kann, ganz ohne Stringverarbeitung:
Code: Alles auswählen
Public Function ZeitRunden2(ByVal Value As Date) As Date
  Dim t0 As Double
 
  t0 = Int(Value * 1440) / 1440

  If Int((Value - t0) * 86400) >= 30 Then
    t0 = t0 + 1 / 1440
  End If
 
  ZeitRunden2 = CDate(t0)
End Function


@Gast:
Das ist keine Spezialität von Access, sondern die Round() Funktion von VBA/VB6 und existiert demnach ebenso in Word und Excel. Excel bringt allerdings außerdem noch weitere WorksheetFunctions zum Runden mit, die man dann stattdessen verwenden kann. Dass muß aber dann explizit angegeben werden!

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4314
Registriert: 02. Jul 2015, 14:23

Re: Uhrzeit ohne Sekunden

Beitragvon KlausMz » 26. Jun 2022, 16:23

Hallo Ulrich,
je mehr ich hier sehe und lese, umso mehr bin ich von meiner Funktion überzeugt.
Auch der Anfänger weis hier sehr schnell wie das funktioniert.
Bei den anderen Funktionen muss man mindestens mal wissen, wie die Zahlen 1440 und 86400 zu Stande kommen. Und Int() sollte auch ein Begriff sein.
DateAdd und DateDiff sind da eher selbsterklärend.
Und Stringverarbeitung findet da mMn auch nicht statt, das Format schneidet ja nur die Sekunden ab und ist nicht wirklich Stringverarbeitung. Sowohl Übergabewert als auch Rückgabewert sind vom Datentyp Date.
Und wenn das eine einmalige Sache ist, spielt die Funktion eine (fast) untergeordnete Rolle.

Aber, dass hier verschiedene Lösungen gezeigt werden ist auch positiv, da hat dann der TE die Wahl, wenn er sich überhaupt noch mal meldet.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Uhrzeit ohne Sekunden

Beitragvon Gast » 26. Jun 2022, 16:26

Sorry, nette Falle von VBA :mrgreen:
Gast
 

Re: Uhrzeit ohne Sekunden

Beitragvon EinGast » 26. Jun 2022, 16:27

Nachfolgend eine weitere Möglichkeit, ohne Verwendung oder Bearbeitung von Fließkommazahlen (Stichwort Rundungsfehler):

Code: Alles auswählen
DateAdd("s" , nz(- Second(UhrzeitFeld) + Abs(60 * (Second(UhrzeitFeld) >= 30)) , 0) , UhrzeitFeld)

Test m Direktbereich:
Code: Alles auswählen
UhrzeitFeld = #11:28:29# : ? UhrzeitFeld , DateAdd("s" , nz(- Second(UhrzeitFeld) + Abs(60 * (Second(UhrzeitFeld) >= 30)) , 0) , UhrzeitFeld)
11:28:29      11:28:00

UhrzeitFeld = #11:28:30# : ? UhrzeitFeld , DateAdd("s" , nz(- Second(UhrzeitFeld) + Abs(60 * (Second(UhrzeitFeld) >= 30)) , 0) , UhrzeitFeld)
11:28:30      11:29:00

UhrzeitFeld muss durch den tatsächlichen Tabellenfeldnamen ersetzt werden.
Wird der Ausdruck in der Abfrage-Entwurfsansicht eingegeben, dann müssen die Kommas durch Semikolons ersetzt werden.
EinGast
 

Re: Uhrzeit ohne Sekunden

Beitragvon knobbi38 » 26. Jun 2022, 19:47

@Klaus:
Und Stringverarbeitung findet da mMn auch nicht statt, das Format schneidet ja nur die Sekunden ab und ist nicht wirklich Stringverarbeitung. Sowohl Übergabewert als auch Rückgabewert sind vom Datentyp Date.

Nur unter uns und am Rande: auch wenn Die Funktion Date als Argument und Rückgabewert hat, wird mit Format() Stringverarbeitung/-konvertierung gemacht, denn der Returnwert von Format() ist dabei sogar Variant/String, bei Format$() dann das etwas performantere String. Beides muß dann wieder zurück nach Date konvertiert werden und, viel wichtiger weil undokumentiert, es geht die Datumsinformation dabei verloren!
... muss man mindestens mal wissen, wie die Zahlen 1440 und 86400 zu Stande kommen

Ok, hätte ich vielleicht kommentieren sollen, aber die Werte sollte eigentlich geläufig sein, wenn man mit Daten rechnet. Funktionen wie int() und co. halte ich für Grundkenntnisse, die man einfach wissen sollte, wenn man programmiert (und das nicht nur mit VBA). Im Zweifel muß man halt nochmal in der Doku nachschauen.

@EinGast:
... ohne Verwendung oder Bearbeitung von Fließkommazahlen (Stichwort Rundungsfehler)

Natürlich wird hier mit Fließkommazahlen gearbeitet, schließlich ist der Date-Datentyp intern nichts anderes wie ein Double. Im Prinzip könnten also auch bei diesen Berechnungen Rundungsfehler auftreten, was aber bei genauer Betrachtung hier vernachlässigt werden kann.
Das Stichwort "Rundungsfehler" als Begründung greift hier also nicht.
Nichtsdestotrotz ein interessanter Ansatz, obwohl ich das Rechnen mit der numerischen Entsprechung von booleschen Werten nicht besonders gut finde, denn das ist sprach- bzw. systemabhängig und läßt sich nicht verallgemeinern.
So wird in T-SQL TRUE durch 1 repräsentiert, in Access JET-SQL aber durch -1 !

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4314
Registriert: 02. Jul 2015, 14:23

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: gdenk und 14 Gäste