Hallo beisammen!
Ich habe in einer Base-DB etwa 2k Liedtitel mit Tags, Texten usw. verknüpft. Funktioniert auch alles soweit - bis auf die Zeitangaben. Jeder Titel hat eine Dauer, im Format MM:SS - solange ich nicht mit diesen Werten rechnen will genügt ja eine einfache Maske - so weit so gut. Ich möchte aber eine Funktion einbauen, mit der ich Titel auswählen und in Listen zusammenstellen kann. Dabei soll die Gesamtzeit aller Titel ermittelt werden - und das bekomme ich einfach nicht hin. Gibt es irgendwo generelle Erleuchtung zum Thema “Rechnen mit Zeitangaben”?
Vielen Dank für Input und kommt alle gut ins neue Jahr!
JP
Base ist keine Datenbank. Base ist ein Werkzeug, um Datenbanken im Kontext dieser Office-Suite zu verwenden. Entscheidend für jede Frage mit Bezug auf Base ist, was ist die Frage nach der tatsächlich verwendeten Datebank. Das steht im linken Teil der Statusleiste Deines Datenbankfensters.
Ich vermute mal dieses hier:
Zeitwerte in HSQL sind als Zeitpunkte (Uhrzeiten) gemeint, nicht als Abschnitte einer Zeitskala (Zeitspannen).
Es ist jedoch recht einfach möglich, Zeiten und Datumswerte in Zahlen umzuwandeln, und wenn diese Zahlen eine Dauer in Tagen representiert, dann kann ein “formatiertes Feld” auf einem Formular oder Bericht oder in Calc diese Anzahl von Tagen als Zeitdauer darstellen, etwa wie 36:45:58. Würdest Du statt Zeiten einfach Minuten und Sekunden speichern, SELECT SUM(1.00000 * "M"/1440 + 1.00000 * "S" * 86400) AS "Dauer" FROM "Tabelle"
summiert alle Minuten und Sekunden in der Einheit “Tage”. Ein formatiertes Feld mit dem Zahlenformat [HH]:MM:SS
zeigt dan diese Summe als Zeitspanne an. Der Faktor 1.00000 bestimmt die Anzahl der Dezimalstellen mit der gerechnet wird.
Mit einer Zeitspalte funktioniert das genau so:
SELECT 1.00000 * HOUR("Z")/24 + 1.00000 * MINUTE("Z")/1440 + 1.00000 * SECOND("Z")/84600 AS "Dauer"
FROM "Tabelle"
Mit einem Zeitfeld gibt es übrigens noch ein anderes Problem. Die Eingabe 4:30 meint viereinhalb Stunden während Du bei Musiktiteln eher viereinhalb Minuten meinst. Wenn man aber konsequent Stunden:Minuten einträgt, dann kann man das trotzdem in korrekte Werte umrechnen, indem man Stunden als Minuten und Minuten als Sekunden rechnet.
Nee, das geht so auch nicht, weil eine Eingabe von mehr als 23 Stunden (gemeint als Minuten) nicht akzeptiert wird. Es gibt ja keinen Zeitpunkt (Uhrzeit) > 23:59:59.
Also entweder man gibt immer eine führende Stunde 0: ein weil ja Musiktitel in der Regel kürzer als eine Stunde sind, oder man benutzt zwei getrennte Spalten für Minuten und Sekunden.
Durations.odb (22.0 KB)
Herzlichen Dank!
Ich glaube, eure Ideen bringen mich schon weiter. Ich fürchtete schon, dass das Feld alles andere als einfach zu beackern ist.
Erstaunlich eigentlich, wo es doch viele denkbare Anwendungen gibt, die solche Funktionen bräuchten.
Wahrscheinlich ist der einfachste Weg der, die Dauer in Sekunden anzugeben und für die Addition ein Skript bzw. eine Funktion zu hinterlegen.
Grüße aus der Eifel!
JP
@poessibility : Wenn Du noch gar kein Feld dafür erstellt hast, dann wäre doch eine Dezimalzahl mit entsprechend vielen Nachkommastellen viel sinnvoller als ein Zeitfeld. Wenn Du 10 Nachkommastellen nimmst, dann kommt das nicht unbedingt auf die Sekunde genau hin, aber spielt bei dem, was Du machen willst, doch keine Rolle. Dann nimmst Du im Formular ein formatierbares Feld und gibst das als Uhrzeit aus. Die Zahlen kannst Du dann nämlich locker summieren und wieder als Zeit ausgeben. Ist eben nur keine Zeit innerhalb der Datenbank.
SheetTime.ods (27.7 KB)
Genau wie die Zellen aller Tabellenkalkulationen der letzten 40+ Jahre funktionieren die formatierten Felder in Formularen und Berichten.
Tabellenkalkulationen kennen nur Text oder Zahl.
Alle Zahlenwerte können als Tageszahlen formatiert werden (1899-12-30 ist Tag 0)
Alle Uhrzeiten sind Bruchteile dieser Tageszahlen.
Bei der Erstellung des neuen Handbuches ist mir zu diesem Thema noch ein Tipp eingefallen:
Existiert die Zeitangabe in einem Zeitfeld, so kann das Zeitfeld nicht summiert werden.
Mit
SELECT SUM( DATEDIFF( 'ss', CAST('00:00:00' AS TIME) , "Zeit") ) FROM "Tabelle"
Erstelle ich aber zuerst die Differenz zur Zeit 00:00:00 in Sekunden und summiere dann einfach alle Zeitangaben. Das Ergebnis kann dann entsprechend wieder umgewandelt werden in eine tatsächliche Zeitangabe. Dabei ist dann aber zu beachten, dass Zeitfelder nur bis 23:59:59 gehen. Für Zeiten darüber wird bei Datenbanken ein TimestampFeld benötigt. Natürlich kann das Ergebnis danach genauso gut als Text ausgegeben werden, sofern damit nicht mehr gerechnet werden soll.
Die physikalisch eindeutige Einheit ist in Sekunden „s“. Damit drückt man die zeitliche Spanne zwischen Start t(0) und Stop t(1) aus. Definieren muss man dann den Uhrzeit-Stempel, wann-wo-wie; schon dieser Stempel ist erklärungs-bedürftig. Mit „s“ lässt sich rechnen, mit anderen Einheiten nicht mehr, denn wie lange dauert genau 1 (!) Tag, 1 Jahr, 1 Millionen Tage? CALC wird ungenau, wenn man zB. ins 12te Jahrhundert zurückgeht.
Für Minute gibts kein Si-Einheits-Zeichen, für Stunde nur hilfsweise „h“, da zumeist eindeutig, wenn man nicht gerade 100 s für 1 Minute annimmt, was Zeitstempel-Systeme einst annahmen, um rechnen zu können.
@Villeroy hat die Vielfachen einer Sekunde gezeigt, um auf Minuten, Stunden, Tagen zu kommen. Das Hantieren mit Brüchen ist noch offensichtlich, zB.: 1 17/60 h für 1 Stunde und 17 Minuten, doch wer oder was rechnet damit?
Das ist alles schön geschrieben - nur was hilft das zu dem Ursprungspost und der Addition von Zeiten in einer Datenbank?
Das, was @Villeroy aufzeigt, ist der wesentliche Punkt: Runterrechnen auf Tagesbruchteile. Und damit die Genauigkeit stimmt, muss mit möglichst vielen Nachkommastellen gerechnet werden. Dies wird durch die Multiplikation mit 1.00000
aufgezeigt. Ich habe hier teilweise noch deutlich mehr Nachkommastellen stehen um die Genauigkeit zu erhöhen. Aber auch da ist je nach verwendeter Datenbank irgendwann eine Grenze.
Base und Calc stellen dann bei der entsprechenden Formatierung eines Feldes die Zeit dar. Denn in Calc und Base ist ‘1’ eben ein Tag und nicht eine Sekunde.