höchsten Datumswert aus Tabelle auslesen
sternis
- datenbank
0 Tom0 Tom
0 niklaskamenisch0 Tom0 Vinzenz Mai0 Tom
0 niklaskamenisch
0 sternis
Hallo!
Ich speichere bei jedem Login eines Nutzers den Namen und die Uhrzeit in eine Tabelle in einer MS SQL-Datenbank.
Ich möchte jetzt gern all die Namen ausgeben, wo das letzte Login 30 Tage zurückliegt.
Schaffe ich das mit einer einzigen Anweisung?
Mit einem
select * from tabelle where loginzeit < '2012-07-01'
komme ich nicht weit. Da erhalte ich zwar alle Logins vom vor 30 Tagen, aber es ist nicht gesagt, dass dies auch das wirklich letzte Login des Nutzers war, sondern nur, ob es Nutzer gab, die sich vor dem 1.7.2012 eingeloggt haben.
Vielen Dank,
Bastian
Hello,
Ich speichere bei jedem Login eines Nutzers den Namen und die Uhrzeit in eine Tabelle in einer MS SQL-Datenbank.
Ich möchte jetzt gern all die Namen ausgeben, wo das letzte Login 30 Tage zurückliegt.
also nicht in der Menge der letzten Tage enthalten ist...
Schaffe ich das mit einer einzigen Anweisung?
Mit einer Ausschlussabfrage. Dazu eröffnet man das Select üblicherweise zweimal auf dieselbe Tabelle, wenn denn die Namen und die Logins in einer Tabelle stehen.
Und dann über die Namen gruppieren
Wie das nun mit M$-SQL genau heißt, weiß ich nicht. Aber das müsstest Du hinbekommen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Ich speichere bei jedem Login eines Nutzers den Namen und die Uhrzeit in eine Tabelle in einer MS SQL-Datenbank.
Ich möchte jetzt gern all die Namen ausgeben, wo das letzte Login 30 Tage zurückliegt.
also nicht in der Menge der letzten Tage enthalten ist...
Schaffe ich das mit einer einzigen Anweisung?
Mit einer Ausschlussabfrage. Dazu eröffnet man das Select üblicherweise zweimal auf dieselbe Tabelle, wenn denn die Namen und die Logins in einer Tabelle stehen.
Und dann über die Namen gruppieren
Wie das nun mit M$-SQL genau heißt, weiß ich nicht. Aber das müsstest Du hinbekommen.
aber hier ein Hinweis auf ein ähnliches Problem
http://www.ms-office-forum.net/forum/showthread.php?t=180502
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
hi,
mir würde da Spontan group by einfallen. Dadurch hast du die benutzer nur jeweils einmal, musst es aber vorher sortieren, damit im group der höchste raus kommt. Darum müsste das 2. select mit der Where < gewünschtes Datum.
So als Denkanregung nach 10h arbeiten ;)
Gruß Niklas
Hello,
mir würde da Spontan group by einfallen. Dadurch hast du die benutzer nur jeweils einmal, musst es aber vorher sortieren, damit im group der höchste raus kommt. Darum müsste das 2. select mit der Where < gewünschtes Datum.
So als Denkanregung nach 10h arbeiten ;)
Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.
nö, ein einfaches HAVING mit MAX(loginzeit) < ... sollte reichen.
Freundliche Grüße
Vinzenz
Hello,
Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.
nö, ein einfaches HAVING mit MAX(loginzeit) < ... sollte reichen.
Nette Idee. Ich kriegs leider nicht hin.
Könntest Du bitte noch mal zeigen?
Bastian wollte ja alle User sehen, die sich schon länger als Datum-x nicht angemeldet haben.
also über die User gruppieren und dann ?
SELECT user
, logindate
FROM logindata
GROUP BY user
HAVING MAX(logindate) < '#datum#';
Mit MySQL müsste das doch auch so funktionieren. Da bekomme ich immer "you have an error near heaving" oder soweas ähniches
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
hi,
Hello,
Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.
nö, ein einfaches HAVING mit MAX(loginzeit) < ... sollte reichen.
Nette Idee. Ich kriegs leider nicht hin.
Könntest Du bitte noch mal zeigen?Bastian wollte ja alle User sehen, die sich schon länger als Datum-x nicht angemeldet haben.
also über die User gruppieren und dann ?
SELECT
user
,logindate
FROMlogindata
GROUP BYuser
HAVING MAX(logindate) < '#datum#';Mit MySQL müsste das doch auch so funktionieren. Da bekomme ich immer "you have an error near heaving" oder soweas ähniches
du kannst in having nur verwenden, was auch im select steht (max ist dort nicht). Daher vermutlich der fehler ... so auf die fixe vermutet.
von einem anderen thema bei mysql.com hab ich diese lösung, die dürftest du für dich anpassen können:
SELECT l.LogID, l.FileID, l.ChangeDate, l.Freitext
FROM log AS l
WHERE l.ChangeDate=(SELECT MAX(ls.ChangeDate) FROM log AS ls WHERE ls.FileID=l.FileID)
GROUP BY l.FileID
auf jeden fall wirst du einen fehler bekommen, da das group by dir das wohl nicht so groupieren wird, wie es für dich sinnvoll ist (er älteste eintrag wird vermutlich angezeigt, da er der mit der kleinsten internen id ist).
Gruß Niklas
hi,
durch das Group By auf eine geordnete liste erhält er die jeweils höchsten Einträge der User. Diese dann noch mals Filtern dass eben die älter als 30 Tage genommen werden.
Geht sicher noch anders, aber so als Anregung eben =) (immerhin wird die Liste durch das Group sofort deutlich kleiner). Zur Not geht man es dann bei der Ausgabe durch. (Ich würde die Chance nutzen und einfach 2-3 Anzeigen machen.(online die letzten 10 tage, online 10-30 tage, älter als 30 tage)
Aber das nur so btw
Gruß Niklas
mir würde da Spontan group by einfallen.
Vielen Dank, das hat mir geholfen.
Schöne Woche euch allen noch.