dani
Goto Top

MySQL - Timestamp vergleichen

Moin DB Jungs,

ich habe hier eine MySQL Datenbankserver der Version 5.0.32 am Laufen. Auf diesem Server läuft eine Datenbank mit der Tabelle "users". So sieht ein Eintrag aus:
FeldTypKollationAttributeNullStandardExtra
idint(11) Nein auto_increment
user_ipvarchar(100)latin1_swedish_ci JaNULL
user_idvarchar(50)latin1_swedish_ci Nein0
user_nickvarchar(100)latin1_swedish_ci NeinUnknown
admin_ipvarchar(100)latin1_swedish_ci JaNULL
admin_idvarchar(50)latin1_swedish_ci Nein0
admin_nickvarchar(100)latin1_swedish_ci NeinUnknown
typevarchar(10)latin1_swedish_ci NeinS
reasonvarchar(255)latin1_swedish_ci Nein
created int(11) Nein0
lengthvarchar(100)latin1_swedish_ci Nein
server_ipvarchar(100)latin1_swedish_ci Nein
server_namevarchar(100)latin1_swedish_ci NeinUnknown


iduser_ipuser_iduser_nickadmin_ipadmin_idadmin_nicktypereasoncreatedlengthserver_ipserver_name
417NULL52609HILDEGUARDxx4.1xx.9x.1x42199775testSfehleingabe12208285255website

Nun möchte ich abfragen, ob die Sperre des Users mit der user_id "2199775" breits abgelaufen ist? Sprich es wird in die Spalte "created" ein UNIX-Timestamp geschrieben. In "length" stehen dann immer Minuten drin - keine Sekunden oder Stunden. Das kann ich auch nicht abändern, auf ein einheitliches Format!

Somit muss ich eigentlich "nur" abfragen, ob der Timestamp in der Zelle + Länge größer ist als der aktuelle Zeitstempel. In SQL sieht die Abfrage dann so aus:
SELECT * FROM bans WHERE user_id != '' AND user_id = '52609' AND UNIX_TIMESTAMP() < (created +(length*60));  
Leider wird die Sperre auch noch nach 10 Minuten als "aktiv" ausgegeben. Was ich aber nicht nachvollziehen kann.
Meine Vermutung ist, dass es Probleme mit der Multilikation gibt...aber kann kein wirklichen Fehler entdecken!


Gruss,
Dani

Content-Key: 96327

Url: https://administrator.de/contentid/96327

Printed on: April 19, 2024 at 16:04 o'clock

Member: Biber
Biber Sep 08, 2008 at 05:47:17 (UTC)
Goto Top
Moin Dani,

Meine Vermutung ist, dass...
Okay, dann lass es uns doch prüfen.
Ändere Dein Statement doch mal kurz so ab, dass alle relevanten Details bzw. Fehlerursachen im Resultset enthalten sind.
SELECT b.user_id, Unix_timestamp() as UnixTS, b.created, b.length, 
 (b.created + (b.length*60)) as EndUnixTScalc
FROM bans b 
WHERE b.user_id = 52609 

P.S. Habt Ihr eigentlich irgendwelche Regeln, nach denen Ihr Datentypen oder Feldlängen auswählt oder macht das immer noch Stevie Wonder bei Euch? face-wink

Grüße
Biber
^^[Edit] Montägliche Tippfehlerberichtigung s.u. [/Edit]
Member: Dani
Dani Sep 08, 2008 at 10:10:06 (UTC)
Goto Top
Moin Biber,
auch dieses DB - Design ist nicht auf unserem Mist gewachsen! Sonst hätte ich es einfach angepasst bzwl. die Jungs mal "rund" gemacht. face-wink Ich habe aber bereits ein BugIssue dies bezüglich in deren Forum eingestellt mit der Bitte das Desgin in v6.0 bitte anzupassen.....

Nun zu dem SQL-Statement:
Das blicke ich ehrlich gesagt noch nicht so....warum "Unix_timestamp as unixts"? Das Attribut gibt es doch gar nicht. Das frisst der SQl-Server auch nicht! Folgender Fehler erscheint:
MySQL meldet:  
#1054 - Unknown column 'Unix_timestamp' in 'field list' 
Was ich auch nicht verstehe, warum frägst du 2 Tabellen in "FROM" ab?!


Gruss,
Dani
Member: Biber
Biber Sep 08, 2008 at 10:34:55 (UTC)
Goto Top
Moin Dani,

sorry, es war mir heute morgen wohl doch noch zu früh fürs tippfehlerfreie Posten...
Es muss natürlich Unix_timestamp() [Unix_timestamp-KlammerAuf-KlammerZu] heißen, es ist ja kein Feld, sondern die gleichnamige Funktion.

Und ich gebe nicht zwei Tabellen an, sondern (D)eine Tabelle bans mit einem Alias [b], eben weil ich ja nicht nur Felder aus dieser tablle SELECTen will, sondern auch noch diesen Unix_TimeStamp().
Ich füge die Klammern mal oben im Source nach - ist natürlich dennoch ungetestet wie immer.

Grüße
Biber
Member: Dani
Dani Sep 08, 2008 at 11:45:21 (UTC)
Goto Top
Hi Biber,
kein Ding...geht mir 7 Tage in der Woche so. face-wink

Also ich habe das SQL-Statment angepasst. Meines sieht so aus:
SELECT b.user_id, Unix_timestamp() as UnixTS, b.created, b.length, (b.created + (b.length*60)) as EndUnixTScalc FROM bans b WHERE b.user_id = 'test' AND Unix_timestamp() < (b.created + (b.length*60));  
Allerdings verstehe ich den Unterschied zu meinem Statement oben nicht. Ich sehe da keinen großen Unterschied bis auf die selektierten Attribute. ???

Die Ausgabe sieht so aus:
user_idUnixTScreatedlengthEndUnixTScalc
test1220890650122089064051220890940

Man sieht also prima, den Vergleich der Zeitstempel....


Gruss,
Dani
Member: Biber
Biber Sep 08, 2008 at 13:15:16 (UTC)
Goto Top
Moin Dani,

oben nicht. Ich sehe da keinen großen Unterschied bis auf die selektierten Attribute. ???
Ähmm ... ooookay......
Eigentlich wollte ich auch nicht mehr damit erreichen als (s.o.) mal alle potentiell fehlerhaft berechneten Spalten auf den Schirm zu bringen.
Magst Du den hoffentlich einzeiligen Resultset mal posten?

Grüße
Biber
Member: Dani
Dani Sep 08, 2008 at 16:19:36 (UTC)
Goto Top
Hi Biber,
hmm....da war wohl ein Table-Tag zu viel drin. Jetzt siehts (siehe oben) schon besser aus. face-wink
Ich werd's jetzt mal in Testbetrieb schalten und diese Wochen im Auge behalten. Du erhälst dann pünktlich zum 17 Uhr Feierabend am Freitag mein Feedback.


Gruss,
Dani
Member: Dani
Dani Sep 10, 2008 at 09:29:21 (UTC)
Goto Top
Hi Biber,
der "bug" - Fall wurde bereits mehrmals durchgespielt und tauchte nicht mehr auf.
Ich verstehs zwar immer noch nicht - aber ist mir euch ehrlich gesagt egal..... face-wink


Gruss,
Dani