# Suche den nächsten timestamp



## RezaScript (19. Sep 2019)

Hallo,

In meiner MySQL-Datenbank habe ich eine Spalte, die `date_of_birth` heisst. Diese beinhaltet Timestamps wie:
483753600 // <-- 1985
799286400 // <-- 1995
1234564290 // <-- 2009
1430438400 // <-- 2015

Mit dem Timestamp 736214400 (welche das Jahr 1993 ausgibt), möchte ich erfahren, welche der Einträge in der Datenbank den Timestamp am nähesten sind und zwar ganz egal, ob drüber oder drunter. In diesem Fall müsste es mir also den Timestamp 799286400 (1995) ausgeben.

Ich habe es so ausprobiert:

```
SELECT uid FROM personal WHERE personal.date_of_birth > 736214400 OR personal.date_of_birth < 736214400 LIMIT 1
```

Die Ausgabe wird 1985 sein, sollte aber jedoch 1995 sein, da 1993 näher an 1995 liegt.

Hätte da jemand eine Lösung für mich?


----------



## Thallius (19. Sep 2019)

Probier mal


```
SELECT MIN(ABS(736214400 - date_of_birth )) FROM personal
```

Gruß

Claus


----------



## RezaScript (19. Sep 2019)

Hmm, das gibt mir folgendes aus:

```
array(1) {
  [0]=>
  array(1) {
    ["MIN(ABS(736214400 - date_of_birth ))"]=>
    string(8) "63072000"
  }
}
```

63072000 = 1971


----------



## RezaScript (19. Sep 2019)

Ich konnte es nun so lösen:


```
SELECT uid FROM personal ORDER BY ABS(date_of_birth - 736214400) LIMIT 1
```


----------



## mihe7 (19. Sep 2019)

Was auch funktionieren sollte:
1. Gib mir die uid aller Personen p1 für die gilt: es existiert keine andere Person p2 mit kleinerem "Timestamp-Abstand".
2. Gib mir die uid aller Personen p1, deren "Timestamp-Abstand" identisch mit dem kleinsten "Timestamp-Abstand" aller Personen ist.

In SQL (ungetestet):

```
SELECT uid
  FROM personal p1
 WHERE NOT EXISTS (
         SELECT 1 
           FROM personal p2
          WHERE ABS(p2.date_of_birth - 1335830400) < ABS(p1.date_of_birth - 1335830400)
       );
```
bzw.

```
SELECT uid
  FROM personal
 WHERE ABS(date_of_birth - 1335830400) = (
         SELECT min(abs(date_of_birth - 1335830400)) 
           FROM personal
       );
```

Was besser/schneller ist, hängt von der Qualität des Optimierers des verwendeten DBMS ab. MySQL da teilweise überhaupt nicht gut darin -> Ausführungsplan anschauen.


----------



## Thallius (19. Sep 2019)

RezaScript hat gesagt.:


> Hmm, das gibt mir folgendes aus:
> 
> ```
> array(1) {
> ...



Naja bisschen selber denken hätte ich jetzt schon erwartet. Du bekommst so natürlich die Differenz. Wenn du den Timesharing haben willst, musste halt noch ne Column mehr selektieren


----------

