Forum: PC-Programmierung SQLite-Problem mit Zeitdarstellung


von Harald K. (Gast)


Lesenswert?

Hallo zusammen.

Ich habe eine Frage zu einem SQLite-Statement.
Es soll eine Zeitdifferenz aus Spalte-1 (Zeitdarstellung: hh:mm:ss, 
Datentyp: DATE) einer Tabelle und einer Spalte-2 (Zeitdarstellung: 
hh:mm:ss, Datentyp: DATE) berechnet werden.

Mit der Funktion strftime() habe ich mit folgendem Befehl die 
Zeitdifferenz in Sekunden von Spalte-2 und Spalte-1 berechnet:
> (strftime('%s',Spalte1) - strftime('%s',Spalte2)

Dies liefert aber wiegesagt nur die Sekunden zurück und nicht die 
gewünschte Darstellung im Format "hh:mm:ss".


Könnt ihr mir helfen, wie ich die Ausgabe im entsprechenden Format 
(hh:mm:ss) bekomme?


Vielen Dank!

von andreasgf (Gast)


Lesenswert?

Hallo,

Versuchsmal mit einer anderen Formatierung :

... strftime('%H:%M:%S', ...

Gruss Andreasgf

von Harald K. (Gast)


Lesenswert?

Hallo Andreas,

das funktioniert anscheinend nicht bei SQLite.
Habe es aufgrund deines Vorschlags ausprobiert:

>strftime('%H:%M:%S', Spalte_2) - strftime('%H:%M:%S', Spalte_1)

von Clemens L. (c_l)


Lesenswert?

Einen Datentyp DATE gibt es nicht; siehe 
http://www.sqlite.org/datatype3.html.

Du musst die Zeiten zuerst in Zahlen umwandeln, um die Differenz 
berechnen zu können, und erst dann wieder in einen String mit dem 
gewünschten Format:

    time(strftime('%s', x) - strftime('%s', y), 'unixepoch')

: Bearbeitet durch User
von Harald K. (Gast)


Lesenswert?

Hallo Clemens,

>Du musst die Zeiten zuerst in Zahlen umwandeln
Die Zeitdifferenz liegt mir als ganzzahliger Wert (in Sekunden) vor.

Ich habe nun versucht, die Differenz zu ermitteln, in dem ich jeweils 
die Zeitdifferenz der Stunden und jeweils die Zeitdifferenz der Minuten 
in einzelne Spalten der DB-Tabelle zu schreiben.
Dies versuchte ich durch:
1
UPDATE Tabelle SET Diff_Stunden = (strftime('%H', Spalte_2) - strftime('%H', Spalte_1))  WHERE Datum=DATE('now');
2
3
UPDATE Tabelle SET Diff_Minuten = (strftime('%M', Spalte_2) - strftime('%M', Spalte_1))  WHERE Datum=DATE('now');

Dies funktioniert aber auch nicht.
Habe ich nämlich in Spalte_1 beispielsweise "11:38" und in Spalte_2 
"13:28" stehen, bekomme ich folgende Ausgabe:
> Diff_Stunden: 2
> Diff_Minuten: -10

Richtig wäre ja:
> Diff_Stunden: 1
> Diff_Minuten: 50

Warum berechnet mir SQLite die Differenz der Minuten mit einem 
negativ-Wert?
Es ist zwar verständlich, wenn man weiß, was mit "-10" gemeint ist, aber 
leserlich ist das nicht wirklich...

Ich weiß leider nicht mehr weiter.
Könnt ihr helfen?

Danke!

von Clemens L. (c_l)


Lesenswert?

Harald K. schrieb:
> Ich habe nun versucht, die Differenz zu ermitteln, in dem ich jeweils
> die Zeitdifferenz der Stunden und jeweils die Zeitdifferenz der Minuten
> in einzelne Spalten der DB-Tabelle zu schreiben.

Warum? Welches Problem versuchst du damit zu lösen?

> Warum berechnet mir SQLite die Differenz der Minuten mit einem
> negativ-Wert?

Weil 28 - 38 = -10. Die Differenz zwischen zwei Zeitstempeln kannst du 
nur ingesamt berechenen, und darfst das Ergebnis erst danach wieder in 
H/M/S umwandeln.

von Harald K. (Gast)


Lesenswert?

Nun habe ich noch versucht, mittels "IF-Anweisung" (die in SQLite "CASE" 
heißt) eine Abfrage zu machen, ob der Wert der Minuten negativ sei.
Ist er dies, so soll die Arbeit_Stunden um 1 dekrementiert werden und 
die Arbeit_Minuten den Wert von 60+Arbeit_Minuten sein.

Funktioniert leider auch nicht:
1
SELECT Arbeit_Stunden, Arbeit_Minuten FROM Tabelle
2
CASE 
3
    WHEN (Arbeit_Minuten < 0) THEN ( Arbeit_Stunden-1) 
4
    WHEN (Arbeit_Minuten < 0) THEN ( 60+Arbeit_Minuten) 
5
END;

von Harald K. (Gast)


Lesenswert?

>Warum? Welches Problem versuchst du damit zu lösen?

Es geht "einfach" nur darum, aus zwei Spalten eine Zeitdifferenz von 
Stunden und Minuten in eine andere Spalte der Tabelle zu schreiben:


 +----------------------------------------------------------------------+
   Spalte_1   |   Spalte_2  |                Diff 
|
 ------------------------------------------------------------------------
    08:12     |    11:22    | <hier soll "03:10" reingeschrieben werden 
|
    12:09     |    14:08    | <hier soll "01:59" reingeschrieben werden 
|
 ------------------------------------------------------------------------

von andreasgf (Gast)


Lesenswert?

Die Lösung hat Clemens bereits gepostet :
Clemens L. schrieb:
> time(strftime('%s', x) - strftime('%s', y), 'unixepoch')

Update Tabelle Set Diff=time(strftime('%s', Spalte_2) - strftime('%s', 
Spalte_1), 'unixepoch');

ggf. solltest du die Spalte Diff als Type Time definieren.

von Harald K. (Gast)


Lesenswert?

Vielen Dank! Es hat geklappt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.