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:
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:
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
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:
Feld | Typ | Kollation | Attribute | Null | Standard | Extra |
id | int(11) | Nein | auto_increment | |||
user_ip | varchar(100) | latin1_swedish_ci | Ja | NULL | ||
user_id | varchar(50) | latin1_swedish_ci | Nein | 0 | ||
user_nick | varchar(100) | latin1_swedish_ci | Nein | Unknown | ||
admin_ip | varchar(100) | latin1_swedish_ci | Ja | NULL | ||
admin_id | varchar(50) | latin1_swedish_ci | Nein | 0 | ||
admin_nick | varchar(100) | latin1_swedish_ci | Nein | Unknown | ||
type | varchar(10) | latin1_swedish_ci | Nein | S | ||
reason | varchar(255) | latin1_swedish_ci | Nein | |||
created | int(11) | Nein | 0 | |||
length | varchar(100) | latin1_swedish_ci | Nein | |||
server_ip | varchar(100) | latin1_swedish_ci | Nein | |||
server_name | varchar(100) | latin1_swedish_ci | Nein | Unknown |
id | user_ip | user_id | user_nick | admin_ip | admin_id | admin_nick | type | reason | created | length | server_ip | server_name |
417 | NULL | 52609 | HILDEGUARD | xx4.1xx.9x.1x4 | 2199775 | test | S | fehleingabe | 1220828525 | 5 | website |
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));
Meine Vermutung ist, dass es Probleme mit der Multilikation gibt...aber kann kein wirklichen Fehler entdecken!
Gruss,
Dani
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 96327
Url: https://administrator.de/forum/mysql-timestamp-vergleichen-96327.html
Ausgedruckt am: 21.04.2025 um 15:04 Uhr
7 Kommentare
Neuester Kommentar
Moin Dani,
Ändere Dein Statement doch mal kurz so ab, dass alle relevanten Details bzw. Fehlerursachen im Resultset enthalten sind.
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?
Grüße
Biber
^^[Edit] Montägliche Tippfehlerberichtigung s.u. [/Edit]
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?
Grüße
Biber
^^[Edit] Montägliche Tippfehlerberichtigung s.u. [/Edit]
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
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
Moin Dani,
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
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