On 2017-11-27 15:21, Uwe Forner <
li...@uforner.de> wrote:
> Hallo,
>> Man kann mit den meisten Programmiersprachen,
>> wie beispielsweise Python, ein Skript schreiben,
>> welches das automatisiert. Voraussetzung, daß die
>> Quelldaten immer strukturiert und konsistent sind.
>>
>> Manuelles Einfügen ist zu fehlerträchtig und
>> zu kostenaufwendig.
>
> Also das scheitert schon daran, das ich die Daten manuell über ein
> Web_Interface abholen muss.
Das lässt sich sicher auch automatisieren. Stefans Rat, sich eine
Scriptsprache wie Python, Perl oder Ruby anzusehen, schließe ich mich
an.
>> Ich verstehe Dein Datenformat nicht genau.
>>
>> Wenn Du Wiederholungsgruppen in CSV haben solltest: Vorher
>> erst einmal normalisieren, so daß es jeweils eine einzige
>> Spalte für die Stunden, Minuten und Sekunden gibt.
>>
>> Wenn diese Spalte dann »H«, »M« beziehungsweise »S« heißt
>> und die Tabelle »HMS«,
>>
>> +------+------+------+
>> | H | M | S |
>> +------+------+------+
>> | 2 | 52 | 15 |
>> | 4 | 41 | 58 |
>> +------+------+------+
>
> Genau so sieht es aus, nachdem ich die Daten von .csv in eine Datenbank
> (im Moment nur als OpenOffice Database, wenn alles funzt, soll dann
> vielleicht mal mysql oder maria-db (wie es jetzt heisst) draus werden.
>
>
> , dann ergibt die Abfrage
>>
>> SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( T )))
>> FROM( SELECT CAST( H || ':' || M || ':' || S AS TIME ) AS T FROM HMS )
>> AS T1;
>>
>> beispielsweise die Summe
>>
>> 07:34:13
>
> Naja, das wäre ein Anfang. Leider stehe ich nicht so tief in sql, um das
> jetzt nachvollziehen zu können.
Ich würde die Zeitdauer als eigene Spalte hinzufügen, z.B. so
(PostgreSQL-Syntax):
create table times(
m_id int, date date,
h varchar, m varchar, s varchar,
d interval);
Diese Dauer kannst Du dann einfach aus den drei Spalten h, m, s
befüllen:
update times set d=(h || ':' || m || ':' || s)::interval;
und anschließend damit rechnen:
hjp=> select m_id, sum(d) from times where date >= '2017-12-01' group by
m_id;
m_id │ sum
──────┼──────────
1 │ 03:02:13
2 │ 03:45:00
(2 rows)
MySQL hat offenbar keinen Interval-Typ (habe schon lange nichts mehr mit
MySQL gemacht) und time-Typen kann man nicht sinnvoll addieren (klar:
Was soll "6 Uhr früh plus halb drei am Nachmittag" sein?), daher hat
Stefan oben kompliziert in Zeit, dann in Sekunden und zum Schluss wieder
in Zeit umgerechnet. In MySQL würde ich daher die Spalte gleich in
Sekunden befüllen:
update times set d = h * 3600 + m * 60 + s;
(in diesem Fall sollten h, m, s natürlich auch numerisch sein).
Zeiten in Sekunden kannst Du dann natürlich auch beliebig summieren und
in Stunden oder Tage oder Microfortnights umrechnen.
>> .) Problem bei MySQL: Wenn die Summe zu groß wird, dann wird
>> das Ergebnis von »SEC_TO_TIME« irgendwann nicht mehr stimmen.
Kommt darauf an, was man mit "stimmen" meint:
MariaDB [simba_test]> select sec_to_time(1000000);
+----------------------+
| sec_to_time(1000000) |
+----------------------+
| 277:46:40 |
+----------------------+
1 row in set (0.00 sec)
1 Million Sekunden sind 277 Stunden, 46 Minuten und 40 Sekunden. Das ist
korrekt. Ob man die Ausgabe in diesem Format haben will, ist eine andere
Frage.
> Man müsste also erst einmal irgendwie
> den Zeitraum in einer Abfrage definieren und dann mit diesem Ergebnis
> diese Summe bilden können.
Das ist kein Problem, siehe oben.
hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | |
h...@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ |
http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel