D'autres ont déjà posté la réponse si vous voulez toujours une date ultérieure:
select *
from your_table
where date > now()
order by date
limit 1
S'il n'y a pas de date future et que vous voulez toujours revenir la dernière date, vous pouvez le faire en modifiant la order by
clause:
select *
from your_table
order by (date > now()) desc,
(case when date > now() then date end) ,
date desc
limit 1;
EDIT (en réponse au commentaire):
pour gérer "aujourd'hui" comme la date la plus proche, vous devez convertir now()
à une date et à l'utilisation >=
:
select *
from your_table
order by (`date` >= date(now())) desc,
(case when `date` >= date(now()) then `date` end) ,
`date` desc
limit 1;
La clause order by
comporte trois volets. Le premier est un drapeau pour toute date future. Cela met les dates futures en premier. Les deux secondes clauses sont classées par date. Les premières commandes du futur datent dans l'ordre croissant. Les dates passées ont toutes la même valeur ('NULL'
), elles sont donc affectées par la troisième clause qui les ordonne dans l'ordre décroissant.
Est-ce que vous voulez toujours obtenir des dates futures ou voulez-vous pour obtenir la date la plus proche avant ou après la date actuelle? – dethtron5000
Les deux dates sont équidistantes. Comment avez-vous déterminé que 2013-08-03 était préféré au 2013-08-01? – eggyal