Abfragen mit Base letztes Datum anzeigen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Abfragen mit Base letztes Datum anzeigen

Re: Abfragen mit Base letztes Datum anzeigen

von violet_Raptor » So, 10.02.2013 21:53

So ich habe es hin bekommen! Mit folgenden Code klappt es

Code: Alles auswählen

SELECT "Wormhole"."Wormhole-ID", "b"."Ort", DATEDIFF( 'dd', "b"."Sternzeit", CURRENT_TIMESTAMP ) AS "Zeit sein Scan [Tage]" FROM "Wormhole", ( SELECT * FROM "Datalog" JOIN ( SELECT "Datalog"."Wormhole" AS "hole", MAX( "Datalog"."Sternzeit" ) AS "SZeit" FROM "Datalog" GROUP BY "Datalog"."Wormhole" ) AS "a" ON "Datalog"."Sternzeit" = "a"."SZeit" ) AS "b" WHERE "Wormhole"."Wormhole-ID" = "b"."Wormhole"
Ich werde mal zur späteren Verständlichkeit aufdrösseln was ich gemacht habe:

1. Aktuelle Wurmlöcher suchen mit

Code: Alles auswählen

 SELECT "Datalog"."Wormhole" AS "hole", MAX( "Datalog"."Sternzeit" ) AS "SZeit" FROM "Datalog" GROUP BY "Datalog"."Wormhole"
Damit erhält man eine logische (virtuelle) Tabelle mit den Spalten "hole" und "SZeit" mit den aktuellsten Datensatz eines Wurmloches. Man muss die Namen ändern, da es sonst im letzten Schritt zu Fehlern kommt.

2. Wir möchten ja nicht nur den Namen und das Datum eines Wurmloches haben, sondern auch alle Daten aus der Tabelle "Datalog". Dies bekommen wir mit

Code: Alles auswählen

SELECT * FROM "Datalog" JOIN ( SELECT "Datalog"."Wormhole" AS "hole", MAX( "Datalog"."Sternzeit" ) AS "SZeit" FROM "Datalog" GROUP BY "Datalog"."Wormhole" ) AS "a" ON "Datalog"."Sternzeit" = "a"."SZeit" 
oder zum bessern durch blick

Code: Alles auswählen

SELECT * FROM "Datalog" JOIN (1. Schritt) AS "a" ON "Datalog"."Sternzeit" = "a"."SZeit" 
Wir erhalten eine logische Tabelle, die aus Datensätzen besteht welche die gleiche Sternzeit (Primärschlüssel, eindeutig) haben. Durch die bequeme Verwendung von * bekommen wir jetzt den Namen sowie die Sternzeit doppelt, daher die Namensänderung bei Schritt 1.

Zum Schluss erhalten wir obiges Konstrukt oder kurz

Code: Alles auswählen

SELECT "Wormhole"."Wormhole-ID", "b"."Ort", DATEDIFF( 'dd', "b"."Sternzeit", CURRENT_TIMESTAMP ) AS "Zeit sein Scan [Tage]" FROM "Wormhole", (2. Schritt) AS "b" WHERE "Wormhole"."Wormhole-ID" = "b"."Wormhole"
bzw. allgemein

Code: Alles auswählen

SELECT "Spalte" FROM "Tabelle", (2. Schritt) AS "b" WHERE "Tabelle"."Wormhole-ID" = "b"."Wormhole"

Re: Abfragen mit Base letztes Datum anzeigen

von RobertG » So, 10.02.2013 21:38

Hallo violet_Raptor,

da verweise ich doch stumpf auf den vorherigen Beitrag mit der korrelativen Unterabfrage. Ist auch in dem Handbuch erklärt. Da bedarf es schließlich keiner Gruppierung um die Differenz heraus zu holen - lediglich eines Bezuges zu dem jeweils aktuellen Datensatz.

Gruß

Robert

Re: Abfragen mit Base letztes Datum anzeigen

von violet_Raptor » So, 10.02.2013 19:06

Super dein Link hat mir weiter geholfen!

Mit

Code: Alles auswählen

SELECT "Datalog"."Wormhole", MIN( DATEDIFF('dd', "Datalog"."Sternzeit", CURRENT_TIMESTAMP) ) AS "Tage seit Scan" FROM "Datalog" GROUP BY "Datalog"."Wormhole"
habe ich es geschafft mir anzeigen zu lasen wie viele Tage der letzte Scan für ein Wurmloch her ist. Wenn ich jetzt aber noch die anderen Spalten (Attribute) dazu haben möchte muss ich die auch bei GROUP BY hinschreiben, was mir mein gewünschtes Konstrukt zerstört gibt es da eine Lösung?

Re: Abfragen mit Base letztes Datum anzeigen

von RobertG » So, 10.02.2013 15:42

Hallo violet_Raptor,

Du hast die Funktion DAY() falsch angewandt. Bei Dir steht DAY hinter einem angeblichen Datum.
Bevor Du mit einem allgemeinen Buch rumschwimmst versuche doch einfach das zu nehmen, was direkt auf die HSQLDB von Base gemünzt ist:
http://de.libreoffice.org/hilfe-kontakt/handbuecher/ - dort ein bisschen nach unten scrollen. Funktionen findest Du im Anhang, Abfragen sind ein Kapitel für sich.

Gruß

Robert

Re: Abfragen mit Base letztes Datum anzeigen

von violet_Raptor » So, 10.02.2013 15:19

Ah danke,
das funktioniert schon ganz gut, leider steht nun in den Zeilen nichts mehr. Ich habe aber leider keine Ahnung was der Code bedeutet, bin da noch beim lesen.

Aber schrauben wir mal kurz ein Stück zurück. Besser als wie mir das letzte Datum anzuzeigen, wäre doch das mir die Abfrage sagt wie viel Zeit vergangen ist (damit ich nicht rechnen brauch). Das müsste doch einfach gehen in dem ich das heutige Datum CURRENT_TIMESTAMP oder NOW() vom eingetragenen Datum abziehe:

Code: Alles auswählen

SELECT "Wormhole"."Wormhole-ID", (CURRENT_TIMESTAMP - "Datalog"."Sternzeit")DAY FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole"
Ich bekomme immer die Meldung Syntax-Fehler, nur was schreib ich falsch?

Re: Abfragen mit Base letztes Datum anzeigen

von RobertG » So, 10.02.2013 09:15

Hallo violet_Raptor,
violet_Raptor hat geschrieben: Später werde ich die Spalte "Test" entfernen und möchte eine Art Max(Sternzeit) machen, wobei mir klar ist das MAX sich nicht auf TIMESTAMP anwenden lässt.
Warum sollte das nicht möglich sein? Ich kann im Abfrageentwurf ganz normal bei einem Datums-und Zeitfeld das Maximum auslesen. Ein Timestamp gibt doch nur die Sekunden an, die ab dem 1.1.1970, 0.00 Uhr vergangen sind. Dahinter steckt also auch eine Zahleneingabe, die sich natürlich ordnen lässt und bei der auch das Maximum auslesbar ist.
Versuche einfach einmal den folgenden Code:

Code: Alles auswählen

SELECT "a"."Wormhole-ID", (SELECT MAX( "Datalog"."Sternzeit" ) FROM "Datalog" WHERE "a"."Wormhole-ID" = "Datalog"."Wormhole") AS "Sternzeit_aktuell" FROM "Wormhole" AS "a"
Es handelt sich dabei um eine korrelative Unterabfrage, die zu jedem Datensatz von "Wormhole-ID" das Maximum aus der Sternenzeit ermittelt.

Gruß

Robert

Re: Abfragen mit Base letztes Datum anzeigen

von violet_Raptor » Sa, 09.02.2013 21:44

Danke RobertG,
jetzt weiß ich schon mal Grob was nicht geklappt hat. Leider bekomme, ich wie du schon meintest, nur den Maximalwert der ganzen Tabelle d.h. nur einen Datensatz raus. Zumindest weiß ich jetzt in welche Richtung ich mich jetzt belesen kann.

Das Problem wie ich ein Datum in eine Zahl bekomme ist aber immer noch ungelöst.

Re: Abfragen mit Base letztes Datum anzeigen

von RobertG » Sa, 09.02.2013 21:34

Hallo violet_raptor,

Code: Alles auswählen

SELECT "Wormhole"."Wormhole-ID", "Datalog"."Sternzeit", MAX( "Datalog"."Test" ) FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole"
Kann deshalb nicht funktionieren, weil eine Funktion wie MAX nur zusammen mit Gruppierungen (GROUP BY) machbar ist.

Code: Alles auswählen

SELECT MAX( "Datalog"."Test" ) FROM "Datalog"
ermittelt Dir den Maximalwert der gesamten Tabelle.

Code: Alles auswählen

SELECT "Wormhole"."Wormhole-ID", "Datalog"."Sternzeit", "Datalog"."Test" FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole" AND "Datalog"."Test" = (SELECT MAX( "Datalog"."Test" ) FROM "Datalog")
sorgt dafür, dass nur der Wert mit dem Maximum angezeigt wurde.

Vielleicht helfen Dir diese Ansätze ja etwas weiter.

Gruß

Robert

Abfragen mit Base letztes Datum anzeigen

von violet_Raptor » Sa, 09.02.2013 20:24

Hallo,
habe mich gerade neu hier angemeldet.

Was ich haben möchte:

Ich möchte mir mit Base eine Datenbank "EVE Online Wormhole-Database" erstellen. Dazu habe ich momentan zwei Tabellen erstellt. Eine Tabelle "Wormhole" mit der Spalte "Wormhole-ID" (CHAR) als Primärschlüssel und weiteren Spalten z.B. Art. Im Prinzip könnte diese Tabelle schon reichen, leider gibt es Wurmlöcher die instabil sind und "springen" daher ist der Ort, das System, nicht statisch. Des weiteren möchte ich auch dokumentieren wie sich die Position des Wurmloches verändert, um später ggf. Prognosen zu erstellen. Daher habe ich die zweite Tabelle "Datalog" mit der Spalte "Sternzeit" (TIMESTAMP) als Primärschlüssel erstellt. Daneben gibt es die Spalte "Wurmloch" (CHAR), "System" (CHAR), "Verbunden" (CHAR) und "Test" (INTEGER). So weit so gut.
Mit einer Abfrage möchte ich nun die aktuellen Daten erhalten d.h. ich möchte nur sehen wo ein Wurmloch zuletzt war, zuletzt hingeführt hat usw.

Mein Problem:

Ich hab hier zwar ein SQL für Dummies liegen aber Base lacht mich nur aus. Anscheinend ist der Syntax nicht zu 100% kompatibel oder ich mache einfach nur was falsch. Deshalb habe ich eine nach langen hin und her eine Spalte "Test" erstellt und möchte mir nun mit der Funktion MAX den Maximalwert ausgeben lassen, dass klappt aber nicht.

Das habe ich momentan stehen:

Code: Alles auswählen

SELECT "Wormhole"."Wormhole-ID", "Datalog"."Sternzeit", MAX( "Datalog"."Test" ) FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole"
Was mache ich falsch?

Später werde ich die Spalte "Test" entfernen und möchte eine Art Max(Sternzeit) machen, wobei mir klar ist das MAX sich nicht auf TIMESTAMP anwenden lässt. Meine Idee war hier so eine Art Intervall zwischen Eintrag und momentaner Zeit (CURRENT_TIMESTAMP) zu berechnen (vlt. in Minuten). Wenn man das dann nach einen Minimalwert absucht sollte man den aktuellsten Eintrag zu einen Wurmloch erhalten. Das bekomme ich aber überhaupt nicht hin.

Nach oben