Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Frage zu BDE

6 views
Skip to first unread message

Uwe Forner

unread,
Nov 26, 2017, 12:34:20 PM11/26/17
to
Hallo,
ich möchte in einer noch zu erstellenden DB Daten aus einer *.csv Datei
einfügen. Diese Datei wird jeden Tag neu erstellt und muss wohl händisch
in die neue DB eingefügt werden.
Mein Problem ist das Format, es werden Betriebsdaten als Zeitdaten
erfasst, welche in einer Spalte die Stunden, in einer weiteren die
Minuten und in wieder einer anderen die Sekunden von Arbeitsprozessen
ablegen. Ich erhalte also in einer Spalt alle Sunden, in einer weiteren
alle Minute usw. und das für mehrere Arbeitsprozesse.
Bis hierher bringe ich das noch hin, der Import der Daten macht erstmal
keine Schwierigkeiten.

Wie bekomme ich aber in einer Abfrage eine addierte Gesamtzeit über
einen festzulegenden Zeitraum (Woche, Monat oder Jahr) in der Form
HH:MM:SS gebacken. Eine einfache Addition hilft mir hier ja nicht weiter.

Vielen Dank
Uwe

Uwe Forner

unread,
Nov 27, 2017, 10:21:18 AM11/27/17
to
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. Ich habe für jeden Arbeitsprozess (eine
Maschine) eine .csv die alle 24 Stunden überschrieben wird.

> 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.


> .) Problem bei MySQL: Wenn die Summe zu groß wird, dann wird
> das Ergebnis von »SEC_TO_TIME« irgendwann nicht mehr stimmen.
>
> In diesem Fall müßtest Du auf SEC_TO_TIME verzichten
> und das Ergebnis in Sekunden akzeptieren, beziehungsweise
> eine eigene Implementation von SEC_TO_TIME schreiben.
>
Also, gefordert ist mindestens die Summenbildung in einem bestimmten
Zeitraum (Woche, Monat und Jahr). Man müsste also erst einmal irgendwie
den Zeitraum in einer Abfrage definieren und dann mit diesem Ergebnis
diese Summe bilden können.

Uwe Forner

unread,
Nov 27, 2017, 10:45:31 AM11/27/17
to
Hallo,
habe ich ganz vergessen. Ich habe mehrere, im Prinzip vom Format her
gleich aussehende csv-Dateien (für jede Maschine eine) in ich im Moment
händisch in die DB importiere. Eine zusätzliche Spalte, welche die
Maschinennummer festlegt, muss ich ohnehin bei jedem Importvorgang
ausfüllen (also ich importiere die Daten einer Maschine und fülle dann
die Spalte "Maschinennummer" manuell aus. Diesen Vorgang wiederhole ich
mehrere Male (so oft, wie ich Maschinen habe), da die csv selbst keinen
verwertbaren Hinweis auf die Maschinennummer enthält.

Peter J. Holzer

unread,
Dec 3, 2017, 5:53:56 PM12/3/17
to
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

Uwe Forner

unread,
Dec 4, 2017, 10:10:18 AM12/4/17
to
Am 03.12.2017 um 23:53 schrieb Peter J. Holzer:> 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.
Hallo,
der Gedanke mit der Umrechnung in Sekunden (lässt sich ja zb. mit Excel
völlig problemlos bewerkstelligen) und dann den Import in eine DB. Ist
natürlich ein sehr guter Lösungsansatz.
Warum bin ich da nicht selbst drauf gekommen? Diese Sekunden kann ich ja
dann in die DB importieren. Die Umrechnung dann wieder in eine "volle"
Zeitangabe kann ja die Client-Software in der Abfrage durchführen.

Das probiere ich mal und denke es könnte ein wirksamer Ansatz sein.
Vielen Dank für den Tip.

MfG
Uwe
0 new messages