# SQL Abfrage mit Timestamp



## fUnKuCh3n (1. Dezember 2006)

Hallo,

ich habe folgendes Problem, ich speichere in einer Tabelle mit dem Feld Timestamp und IP den aktuellen Timestamp und die aktuelle IP und jetzt möchte ich vergleich wenn der Timestamp dem heutigen Tag entspricht also das Datum des Timestamp = heute ist und die IP noch nicht für heute eingetragen ist dann soll er einen neuen Eintrag in die SQL Datenbank machen, jedoch weiss ich nicht so richtig wie ich das mit dem Timestamp vergleich machen soll, weils halt als Timestamp gespeichert wird. 

Mein voriger Code ( aber mit Datum und Zeit noch ) sieht wie folgt aus:

```
$query = mysql_query("Select * from $tbl[x4] where (ip = '$ip') AND (date = '$date')");
if( mysql_num_rows($query) < 1 ) {

MySQL_QUERY("INSERT INTO `$tbl[x4]` ( `ip`, `date`, `time` )
VALUES
('$ip', '$date', '$time')");
}
```
Das ganze soll eigentlich als einfacher Tages Counter arbeiten...

Liebe Grüße


----------



## matdacat (1. Dezember 2006)

Warum verwendest du einen Timestamp, wenns dir eh nur ums Datum geht? Könntest du nicht das Datum in deine Tabelle schreiben? Dann wird dein Vergleich einfacher.

Ansonsten kannst du mittels date den Timestamp in PHP umwandeln. Oder vielleicht sogar während der SQL-Abfrage mit SELECT DATE(dein_timestamp).


----------



## fUnKuCh3n (1. Dezember 2006)

Ja, du hast schon recht aber mir geht es darum das ich alles vereinheitliche und da ich zum Größten Teil schon Timestamps benutze dachte ich dass ichs da auch machen werde. Aber sollte sich hier keine Lösung finden mach ichs wie vorher


----------



## matdacat (1. Dezember 2006)

Ich hab jetzt leider kein MySQL für Tests zur Hand, aber bei diesen Funktionen müsste was für dich dabei sein.


----------



## Radhad (1. Dezember 2006)

Ich finde den Timestamp dafür hervorragend 

Ich habe das Problem wie folgt gelöst:

```
$today = bcdiv(time(),86400,0);
```
Ich Teile also den aktuellen Zeitstempel durch die Anzahl der Sekunden für einen Tag. Damit hätte ich ale "Heute" herausgefunden.

```
$yesterday = bcdiv(time(),86400,0)-1;
```
Dies würde dann "Gestern" entsprechen  Ich finde das eigentlich sehr einfach und so brauch ich nichts mit date() umzuwandeln!


Gruß Radhad


----------



## fUnKuCh3n (1. Dezember 2006)

hmm, irgendwie versteh ich deine Aktion net *g* Also wie würde das denn in der Abfrage angewandt werden bzw wie arbeite ich das mitm Timestamp ab? Einfach anstelle von time(); ?


----------



## matdacat (1. Dezember 2006)

Radhad hat gesagt.:


> Ich habe das Problem wie folgt gelöst:
> 
> ```
> $today = bcdiv(time(),86400,0);
> ```


So wie ich saschax' Problem verstehe, sollte der Check bereits im SQL-Statement durchgeführt werden und nicht mittels PHP.

Ansonsten könntest du dir alle Timestamps einer IP rein anhand der ID aus der Tabelle suchen und diese dann mit PHP-Funktionen überprüfen. Eine SQL-Lösung wäre aber sicherlich schöner.


----------



## matdacat (1. Dezember 2006)

So könnts mit SQL in MySQL funktionieren:


```
..AND (timestamp > (CURRENT_TIMESTAMP()-(CURRENT_TIMESTAMP()%86400)))
```

Wenn man vom aktuellen Timestamp die Sekunden des heutigen Tages (modulo-Operation) abzieht, erhält man den Timestamp von heute Mitternacht. War der Besucher heute schon da, muss der Timestamp dieses Besuchs größer sein als der Mitternachts-Timestamp.

Gut möglich, dass es eine einfachere Lösung gibt


----------



## Radhad (1. Dezember 2006)

Hmm... im ersten Moment dachte ich, das wäre falsch.

Hast quasi meins gut umgesetzt um das Abfrage-Ergebnis zu verringern. Sieht gut aus 

Aber im Endeffekt wird das Ergebnis ja in PHP ausgewertet ^^


----------



## fUnKuCh3n (14. Januar 2007)

Hey, ich habe nun noch mal ein bisschen rumgetüddelt und irgendwie bekomme ich die Sache trotzdem nicht zum laufen, wenn ich folgenden SQL String in phpMyAdmin ausführen will:

```
Select * from counter where (ip = 'meine momentane ip') AND (timestamp > (CURRENT_TIMESTAMP()-(CURRENT_TIMESTAMP()%86400)))
```


= >Ihr SQL-Befehl wurde erfolgreich ausgeführt.

Aber ich erhalte keine Ergebnisse.


----------

