Pero' ho finalmente capito io i tuoi dubbi.... andiamo con ordine.
mettiamo che il valore cercato sia un id invece di un timestamp.
codice:
(SELECT pippo FROM ctabella 
WHERE id  < '50'      // qui prendiamo tutti i minori di 50
order by pippo desc   // qui li ordiniamo in modo discendente
limit 1)              // qui prendiamo solo il primo dell'ordinamento
                      // potrebbe essere il 49
UNION
 
(SELECT pippo FROM ctabella 
WHERE id >= '50'      // prendiamo il 50 se esiste e maggiori
order by pippo asc   // qui li ordiniamo in modo ascendente
limit 2)              // prendiamo i primi due ordinati
                      // potrebbero essere se ci sono 50 e 51
in questo modo a partire dal riferimento 50 andremo a prendere il primo minore, il 50 se esiste, ed il primo maggiore.
Nel caso non esista il 50 prenderemo i due subito maggiori. Qui si potrebbe scegliere se mancando il 50, prendere i due minori invece dei due maggiori... basterebbe solo portare il valore = nella prima parte della UNION...