# SELECT



## PollerJava (5. Dez 2007)

Hallo,

ich arbeiote mit der DB FireBird und möchte eine wirtzige Abfrage machen,
Und zwar habe ich  in meiner DB 2 Spalten (TIMESTAMP, FLOAT),
aus dieser Tabelle möchte ich jetzt eine Abfrage starten, mit der ich alle Tupel raushole, die laut Zeitstempel eine Stunde oder länger auseinander liegen,

z.B.: starte ich die Abfrage bei 2007-07-07 12:11:20
der nächste Eintrag sollte dann 2007-07-07 13:11:20 oder größer sein,
ist das irgendwie mit einem SELECT- Statement möglich,

Vielen Dank für Eure Antworten,

lg


----------



## tuxedo (5. Dez 2007)

Hmm, glaub nicht dass das direkt geht. Schließlich müsste man ja jeden eintrag mit jedem vergleichen um die Differenz heraus zu finden. 

Lasse mich aber gerne eines besseren belehren.

- Alex


----------



## HoaX (5. Dez 2007)

man muss nur einen join der tabelle auf sich selbst machen, wobei ein eintrag mit dem zeitlich nächsten gejoint wird. dann kann man die differenz der beiden berechnen lassen und entsprechend aussortieren.


----------



## SlaterB (5. Dez 2007)

interessant, dann hast du von
12:11:20 
12:15:20 
13:11:20 
13:15:20 

gejoint

12:11:20 13:11:20 
12:15:20 13:15:20 

aber noch keine komplette Reihe, 
mehrmals joinen, aber geht auch tausende male? und kenn man die Anzahl vorher?


----------



## lolkind (6. Dez 2007)

Guten Morgen!

Also, ich hab mir mal eine Tabelle erstellt (test) mit Namen/Vornamen/BDay um dies auszuprobieren.

Meine Abfrage sieht jetzt so aus:



```
SELECT name, vorname, bday
FROM tab_test
WHERE bday>#11/11/2000#
ORDER BY bday;
```

1. SELECT  = Tabellenspalte, die ausgegeben werdenn soll
2. FROM = Von welcher Tabelle/n sind die Spalten
3. WHERE = Was muss bei den ausgegebenen Datensätzen zutreffen
4. ORDER BY = Wie sollen die gefundenen Datensätze sortiert werden

Weitere Hinweise:

Wenn man hinter dem "ORDER BY", nach der Sortierungsspalte ein "DECT" schreibt, so erhält man die umgekehrte Reihenfolge.


MFG
das lolkind


----------



## PollerJava (6. Dez 2007)

Also die Tabelle liegt sortiert nach dem TIMESTAMP vor:


```
2007-07-07 12:11:20   12
2007-07-07 12:11:24   14
2007-07-07 12:11:26   11
2007-07-07 12:11:32   54
2007-07-07 12:11:50   11
2007-07-07 12:11:57    9
...
```

Die Anzahl der in der Tabelle enthaltenen Tupel ist mir nicht bekannt,


----------



## lolkind (6. Dez 2007)

???:L  Hast du eine Frage vergessen?

Falls ich das richtig verstehe(die nicht vorhandene Frage ^^):

Ich =
WHERE bday>#11/11/2000# 
         ORDER BY bday;

Du =
WHERE TIMESTAMP>#2007-07-07 12:11:24#
         ORDER BY TIMESTAMP;


Wobei du bei einer Java-SQL-Abfrage die Zeit "2007-07-07 12:11:24" durch eine Variable ersetzen kannst.
Geht natürlich auch im VB-Quellcode!

Aber bitte formuliere dein Problem, damit ich dir besser helfen kann.

MFG
das lolkind


----------



## PollerJava (6. Dez 2007)

lolkind hat gesagt.:
			
		

> Du =
> WHERE TIMESTAMP>#2007-07-07 12:11:24#
> ORDER BY TIMESTAMP;
> 
> ...




OK, so viel wie ich jetzt verstanden habe, sind dann alle TIMESTAMPS, die ich mit der Abfrage oben raushole, größer als 2007-07-07 12:11:24, aber ich würde ja nur die Tupel benötigen, welche größer 2007-07-07 12:11:24 sind UND eine Stunde auseinander liegen,

Ich müsste praktisch den ersten Eintrag herausholen, der größer #2007-07-07 12:11:24# ist, dann eine Stunde dazuzählen, den nächsten Eintrag herausholen, wieder eine Stunde dazu, den nächsten usw.

Oder hab ich bei der Abfrage oben etwas übersehen??

lg und vielen Dank,


----------



## FenchelT (6. Dez 2007)

PollerJava hat gesagt.:
			
		

> Hallo,
> 
> ich arbeiote mit der DB FireBird und möchte eine wirtzige Abfrage machen,
> Und zwar habe ich  in meiner DB 2 Spalten (TIMESTAMP, FLOAT),
> ...



Moin,

wenn ich Dirch richtig verstanden habe moechtest Du sowas:

Gegeben:
MSSQL Server tabelle = test felder = id (int) und datum(smalldatetime)  aktuelle Systemzeit = 06.12.2007 08:40:06


```
id    |    datum
1    |    15.10.2007 16:31:00
2    |    06.12.2007 10:00:00
3    |    06.12.2007 10:16:00
4    |    07.12.2007 08:01:00
5    |    06.12.2007 08:30:00
6    |    06.12.2007 08:46:00
```


Nun kannst Du die Systemzeit im SQL abfragen und mit ausgeben, genauso kannst Du die Differenzzeit zwischen Systemzeit und Datumszeit ausrechnen lassen mittels


```
SELECT id, datum, getdate() as sysdate, datediff(hh, getdate(), datum) as diff  //das hh bedeutet differenz in Stunden
FROM test
```

Du erhaeltst dann als Ergebnis:


```
id    |    datum                       |      sysdate            |      diff
1    |    15.10.2007 16:31:00   |      06.12.2007 08:40:06       |      -1240
2    |    06.12.2007 10:00:00   |      06.12.2007 08:40:06       |       2
3    |    06.12.2007 10:16:00   |      06.12.2007 08:40:06       |       2
4    |    07.12.2007 08:01:00   |      06.12.2007 08:40:06       |       2
5    |    06.12.2007 08:30:00   |      06.12.2007 08:40:06       |       0
6    |    06.12.2007 08:46:00   |      06.12.2007 08:40:06       |       0
```


Nun kannst Du Deinen SQL erweitern um eine WHERE Bedingung


```
SELECT id, datum, getdate() as sysdate, datediff(hh, getdate(), datum) as diff  //das hh bedeutet differenz in Stunden
FROM test
WHERE datediff(hh, getdate(), datum) > 1 OR datediff(hh, getdate(), datum) < -1
```


Dann erhaeltst Du als Ausgabe nur noch die Datensaetze mit der ID 1 bis 4


Sollte es das sein was Du moechtest, musst Du Dich mit den Datumsfunktionen Deines RDBMS beschaeftigen.
Falls Du was anderes moechtest, habe ich Dich falsch verstanden 
 :wink:


----------



## lolkind (6. Dez 2007)

Ich meinte nur, dass du dir die gewünschte Zeit, ab der die Datensätze angezeigt werden sollen, einsetzt.
Alle Zeiten die danach kommen werden ja angezeigt, wie du eigentlich wolltest.

Ich hab keine Ahnung wie du auf die "+1Stunde" kommst, oder musst du das so machen?
Wenn ja, dann wäre die Antwort von FenchelT deine Lösung.

MFG
das lolkind


----------



## PollerJava (6. Dez 2007)

Ja genau, das kommt schon hin,

sysdate kann aber nur größer sein als der letzte Eintrag, oder, ich starte ja eine Abfrage zu der zeit sysdate, und da gibt es ja keine größeren Werte als sysdate.

Ein weiteres Problem ist noch, dass ich einstellen kann, ab wann die Abfrage beginnen kann,


----------



## FenchelT (6. Dez 2007)

Hallo,

das mit dem Systedate war doch nur ein Beispiel, weil cih davon ausgegangen bin, dass Du kein eigenes Datum vorliegen hast  :wink: 

die Funktion datediff berechnet die Differenz in tagen, monaten, jahren, stunden, usw. von zwei DAten.
Ob das eine nun sysdate ist oder eins was Du in JAva in einer Variablen vorliegen hast und in den SQL einsetzt
spielt keine Rolle


----------



## PollerJava (6. Dez 2007)

Vielen Dank , ich werds mal ausprobieren, ob ich hinkomme,

lg


----------



## PollerJava (6. Dez 2007)

Hätte noch ne frage und zwar wenn ich die erste Abfrage mache, dann hole ich mir ja wieder alle Daten in die JVM oder


```
SELECT id, datum, getdate() as sysdate, datediff(hh, getdate(), datum) as diff  //das hh bedeutet differenz in Stunden
FROM test
```

oder bleibt diese Tabelle als virtuelle Tabelle in der Datenbank?

lg


----------



## FenchelT (6. Dez 2007)

Oh man  :roll: 
Nix fuer ungut, ich dachte nur, wenn ich Dir das ausfuehrlich, Schritt fuer Schritt erklaere, dann ist es besser zu verstehen.
Ich glaube, ich habe das Gegenteil bewirkt.

Natuerlich holt Dir ein SQL ohne WHERE BEdingung alle Datensaetze, deshalb musst DU ja auch die WHERE Bedingung benutzen  :wink: 


Ich wollte Dir doch nur zeigen, wie sich was Schritt fuer Schritt in der Ausgabe veranedert.


Gruesse


----------



## PollerJava (6. Dez 2007)

OK, jetzt ist es hoff. angekommen, Ist eh super erklärt!!!! :idea:

Jetzt muss ich nur noch herausfinden, wie getdate() bei Firebird heißt.


----------



## FenchelT (6. Dez 2007)

PollerJava hat gesagt.:
			
		

> OK, jetzt ist es hoff. angekommen, Ist eh super erklärt!!!! :idea:
> 
> Jetzt muss ich nur noch herausfinden, wie getdate() bei Firebird heißt.



Genau und wie die Funktion datediff bei Firebird heisst.
getdate() ist in manchen Datenbanken sysdate() oder date()

Gruesse


----------



## PollerJava (6. Dez 2007)

Weiß das vielleicht wer, wie DATEDIFF in FireBird heißt, 
da ist nicht viel zu finden, timestampdiff ist es auf jeden fall nicht, das habe ich schon versucht,


----------



## FenchelT (6. Dez 2007)

Hallo,

evtl, findest Du ja auf der Firebird Seite HIlfe.
http://www.firebirdfaq.org/cat3/

Und hier der Link, wie Du an die Systemzeit kommst
http://www.firebirdfaq.org/faq114/


EDITH:
Guckst Du hier fuer Datumsberechnungen:
http://www.firebirdfaq.org/faq35/


----------



## PollerJava (6. Dez 2007)

Vielen vielen dank, 

Also ich kann jetzt die differenz ausrechnen ( end_time - start_time ) aber dann passt die Abfrage nicht mehr oder?

```
SELECT id, datum, getdate() as sysdate, datediff(hh, getdate(), datum) as diff  //das hh bedeutet differenz in Stunden
FROM test
WHERE datediff(hh, getdate(), datum) > 1 OR datediff(hh, getdate(), datum) < -1
```


----------



## PollerJava (6. Dez 2007)

Hallo nochmal,

ich habs jetzt so versucht:


```
SELECT (current_date - zeitstempel) FROM myTable WHERE (current_date - zeitstempel) < -1
```

und bekomme leider eine Fehlermeldung:

STATEMENT FAILED, SQLCODE = -833, EXPRESSION EVALUATION NOT SUPPORTED

Was mache ich da falsch,

Danke für Eure Hilfe

lg Bin gerade draufgekommen, dass diese Möglichkeit auch nicht geht, da ich ja nur immer pro 
Stunde einen Eintrag benötige, nicht aber alle die größer als z.B.: eine Stunde sind


----------

