SQLite-Frage - Statement

Gast #4839188
Lesenswert?
• ▲
▼
Guten Abend!

Ich bin mir sicher, dass man mir hier im Forum helfen kann.

Ich suche ein SQL-Statement, welches in die dritte Spalte meiner 
SQL-Tabelle "Test" einen Wert schreibt, sofern der Wert in Spalte "1" 
beträgt:

Die Tabelle besteht aus drei Spalten:
 - Datum
 - Uhrzeit_1
 - Uhrzeit_2

Sofern "Datum" dem heutigen Datum entspricht, soll in den jeweiligen 
Eintrag in "Uhrzeit_2" die jetzige Uhrzeit eingetragen werden.

So habe ich zumindest die Tabelle generiert:
1
CREATE TABLE IF NOT EXISTS Test(Datum DATE, Uhrzeit_1 TIME, Uhrzeit_2 TIME);

Nun muss zum Schreiben in die Datenbank aber wie beschrieben noch ein 
Statement angefügt werden, damit überhaupt in die Datenbank geschrieben 
werden kann...
1
INSERT INTO Test VALUES  ...


Könnt ihr mir helfen? :-(


Vielen Dank!
Gast
Lesenswert?
• ▲
▼
Ich habe zwei Button...

Um die GUI etwas zu erläutern:


Button-1 macht folgendes:
Schreibe in Spalte-1 das jetzige Datum,
Schreibe in Spalte-2 die jetzige Uhrzeit;

Button-2 soll folgendes machen:
Schreibe in Spalte-3 die jetzige Uhrzeit, ohne Spalte-1 und Spalte-2 zu 
überschreiben, sofern Spalte-1 dem heutigen Datum entspricht.

Nach dem Drücken auf Button-2 sollen also 3 Werte vorliegen.
Gast
Lesenswert?
• ▲
▼
SQElitär schrieb:
> Button-2 soll folgendes machen:
> Schreibe in Spalte-3 die jetzige Uhrzeit, ohne Spalte-1 und Spalte-2 zu
> überschreiben, sofern Spalte-1 dem heutigen Datum entspricht.

OnButton
  update Test set Spalte-3 = {aktuelle Zeit} where Spalte-1 = {aktuelles 
Datum}

versteht das Problem scheinbar nicht.
Gast
Lesenswert?
• ▲
▼
Das Programm läuft gegen die Wand:
1
final SQLiteDatabase db = openOrCreateDatabase("StudentDB", Context.MODE_PRIVATE, null);
2
        db.execSQL("CREATE TABLE IF NOT EXISTS Zeiterfassung(Datum DATE, Kommen TIME, Gehen TIME, Arbeitszeit TIME);");
3

4
        //final TextView txt = (TextView) findViewById(R.id.textView1);
5
        // final EditText txt_kommen = (EditText) findViewById(R.id.txt_Kommen);
6
        //kommen.setText("Play");
7

8
        kommen.setOnClickListener(new View.OnClickListener()
9
        {
10
            @Override
11
            public void onClick(View v)
12
            {
13
               // db.execSQL("INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';");
14
                Toast.makeText(getApplicationContext(), "Kommen-Zeit wurde gebucht!", Toast.LENGTH_LONG).show();
15
            }
16
        });
17

18

19

20
        gehen.setOnClickListener(new View.OnClickListener()
21
        {
22
            @Override
23
            public void onClick(View v)
24
            {
25
                db.execSQL("UPDATE Zeiterfassung SET Gehen = TIME('now') WHERE Datum = DATE('now');");
26
                Toast.makeText(getApplicationContext(), "Gehen-Zeit wurde gebucht!", Toast.LENGTH_LONG).show();
27
            }
28
        });
Gast
Lesenswert?
• ▲
▼
>Konkreter bitte

Beim Drücken auf "Kommen" kommt folgende Meldung in der IDE:
1
 E/SQLiteLog: (1) near "now": syntax error
2
12-24 09:42:45.171 7790-7790/com.example.jk.zeiterfassung D/AndroidRuntime: Shutting down VM
3
12-24 09:42:45.181 7790-7790/com.example.jk.zeiterfassung E/AndroidRuntime: FATAL EXCEPTION: main
4
                                                                            Process: com.example.jk.zeiterfassung, PID: 7790
5
                                                                            android.database.sqlite.SQLiteException: near "now": syntax error (code 1): , while compiling: INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';
6
                                                                            #################################################################
7
                                                                            Error Code : 1 (SQLITE_ERROR)
8
                                                                            Caused By : SQL(query) error or missing database.
9
                                                                              (near "now": syntax error (code 1): , while compiling: INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';)
10
                                                                            #################################################################
Lesenswert?
• ▲
▼
Achtung: Wenn du Datum und Uhrzeit in zwei Spalten speicherst, solltest 
du auch die zugehörige Zeitzone dazu abspeichern.

Oder wie willst du erkennen ob bei einem Eintrag von 30.10.2016 02:30:00 
Sommerzeit oder Winterzeit war?

Falls mit den Zeitpunkten gerechnet werden soll (wovon ich ausgehe) 
würde ich empfehlen alles auf GMT-Timestamps zurück zu führen und bei 
der Anzeige passend umrechnen.

VG
Roland
Persönliche Seite
Lesenswert?
• ▲
▼
SQElitär schrieb:
> (near "now": syntax error (code 1): , while compiling: INSERT INTO
> Zeiterfassung VALUES('DATE('now'),TIME('now')';)

Da fehlt eine Klammer.
1
db.execSQL("INSERT INTO Zeiterfassung  VALUES('DATE('now'),TIME('now')';");

Zähle die öffnenden und die schließenden Klammern
1
db.execSQL("INSERT INTO Zeiterfassung  VALUES('DATE('now'),TIME('now')';");
2
Ö         1                                  2     3           4 
3
S                                                        1           2   3
Gast
Lesenswert?
• ▲
▼
Hallo zusammen,

>db.execSQL("UPDATE Zeiterfassung SET Gehen = TIME(\'now\') WHERE Datum = 
>DATE(\'now\');");
Ok, jetzt funktioniert das! Danke!


>Achtung: Wenn du Datum und Uhrzeit in zwei Spalten speicherst, solltest
>du auch die zugehörige Zeitzone dazu abspeichern.
Ja, dieses Problem versuchte ich mit folgender Zeile Code zu lösen. 
Leider erscheinen die beiden Uhrzeiten nicht in der richtigen Zeitzone 
(1 Stunde zu früh).
Wisst ihr, warum trotz dieser Zeile die Uhrzeit falsch gezeigt wird?
1
 db.execSQL("CREATE TABLE IF NOT EXISTS Zeiterfassung(Datum DATETIME DEFAULT (DATETIME(CURRENT_TIMESTAMP, \'LOCALTIME\')), Kommen DATETIME DEFAULT (DATETIME(CURRENT_TIMESTAMP, \'LOCALTIME\')), Gehen DATETIME DEFAULT (DATETIME(CURRENT_TIMESTAMP, \'LOCALTIME\')), Arbeitszeit TEXT);");

Außerdem liefert mir beim Drücken auf "Zeiten ausgeben" die Textbox 
nicht ALLE Einträge der Datenbank zurück sondern immer nur den letzten 
:-(
1
if (c.getCount() == 0) {
2
                    return;
3
                }
4
                StringBuffer buffer = new StringBuffer();
5
                while (c.moveToNext())
6
                {
7
                        buffer.append(c.getString(0) + "   ");
8
                        buffer.append(c.getString(1) + "   ");
9
                        buffer.append(c.getString(2) + "\n");
10
                        txt_zeitnachweis.setText(buffer.toString());
11
                }
12
}

Auch das verstehe ich nicht..
Danke!
Gast
Lesenswert?
• ▲
▼
>Das überschreibt den gesamten Text in "txt_zeitnachweis".

"c" ist ein Cursor:
1
 Cursor c = db.rawQuery("SELECT * FROM Zeiterfassung", null);
2
                if (c.getCount() == 0) {
3
                    return;
4
                }
5
                StringBuffer buffer = new StringBuffer();
6
                while (c.moveToNext())
7
                {
8
...
Gast
Lesenswert?
• ▲
▼
Also ich habe jetzt noch zwei Probleme:
 - Die Zeitzone lässt sich nicht ändern bzw. die Uhrzeiten sind um eine 
Stunde zu früh
 - Die Datenbank-Entries werden nicht alle in der TextView angezeigt.


Wisst ihr, woran es liegen kann?

Danke schonmal und ein frohes Fest!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.