Vamos a ver si te entiendo.
Código SQL
[-]SELECT * FROM Tabla WHERE Fecha Not > **TuFecha** ORDER BY Fecha DESC
Es decir, eliminas las fechas mayores a la tuya, con el resto las ordenas en orden descendente, con lo que la primera que obtienes es la que tu buscas.
o de una forma más sencilla:
Código SQL
[-]SELECT MAX(Fecha) FROM Tabla WHERE Fecha Not > **TuFecha**
En ambos casos debes tener en cuenta los problemas de trabajar con fechas y horas al mismo tiempo. O bien en el campo seleccionado haces un CAST para filtrar solo la fecha o en **TuFecha** le añades la hora (0:00:00).
Haz pruebas con esto.
Perdón edito el mensaje porque no había visto que buscas la fecha con hora más próxima a las 23:00 h.
* Si te da igual el día (lo que prima es la hora) --> el select es parecido pero en lugar de fecha filtra por la hora
* Si la fecha y la hora son un par inseparable y lo que prima es el día, la solución es la que pongo arriba, pero a la fecha de busqueda le añades la hora 23:00:00