Forum: PC-Programmierung SQLite-Problem mit Zeitdarstellung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Harald K. (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Versuchsmal mit einer anderen Formatierung :

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

Gruss Andreasgf

von Harald K. (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! Es hat geklappt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.