2013-07-03 5 views
2

Nous avons deux dates dans la base de données:MySQL - Obtenez suivant le plus proche jour entre deux jours

  1. 2013-08-01
  2. 2013-08-03

Disons que la date d'aujourd'hui est 2013-08-02 et nous voulons obtenir la prochaine date la plus proche de la base de données. J'ai trouvé cette requête, mais ça ne se le lendemain mais précédent:

SELECT 
    * 
FROM 
    your_table 
ORDER BY 
    ABS(DATEDIFF(NOW(), `date`)) 
LIMIT 1 

Quand nous courons, nous obtenons 01/08/2013 et non 03/08/2013 que nous voulons. Quelle serait la solution?

+0

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

+0

Les deux dates sont équidistantes. Comment avez-vous déterminé que 2013-08-03 était préféré au 2013-08-01? – eggyal

Répondre

2

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.

+0

La deuxième requête est presque bonne, mais que se passe-t-il si pointe sur aujourd'hui? – user1257255

+0

Merci beaucoup! Pourriez-vous s'il vous plaît ajouter quelques commentaires à "classer par", parce que c'est la première fois que je vois une requête avec plus de "trier par" sous-requêtes, surtout avec un cas qui est quelque chose de nouveau pour moi. – user1257255

2
SELECT * 
FROM  your_table 
WHERE date >= CURRENT_DATE 
ORDER BY date 
LIMIT 1 
+0

Je pense que OP ne veut que la date future s'il n'y a pas de date plus proche. –

0
SELECT * FROM table WHERE date > NOW() ORDER BY date ASC LIMIT 1; 

Vous obtiendrez la prochaine date la plus proche

+0

mais que se passe-t-il s'il n'y a actuellement aucune date dans le futur, seulement pour le passé? – user1257255

0
SELECT * FROM your_table 
ORDER BY 
    MIN(DATEDIFF(NOW(), `date`)) ASC 
LIMIT 1 

vous donnera une plus, pour cause de date ultérieure, il sera -1, puis 1,2, ..., Alors rangez-les par ASC et sans ABS, mais pas sûr que ce soit bon pour toutes vos situations.

+0

avec celui-ci je reçois seulement la date la plus récente, mais pas la prochaine – user1257255

+0

essayer avec 'MIN (DATEDIFF (NOW(), date) ASC)' – mirkobrankovic

0

il doit être là une condition where sur la date pour donner seulement les dates suivantes et non les précédentes

+0

Veuillez fournir un exemple. Merci! – user1257255

+0

supposons que nous avons ces valeurs:
01-01-2013
03-01-2013
05-01-2013
et la fonction NOW() retourne 01/02/2013
avec l'état où il retourne 03-01-20
ktaria

Questions connexes