2017-10-14 1 views
-1

Aujourd'hui est: 2017-10-14, et voici une table des dates de l'événement:MySQL - Triés premiers événements futurs événements alors passés

... 
2017-10-18 
2017-10-17 
2017-10-16 
2017-10-14 
2017-10-12 
2017-10-10 
2017-10-09 
.... 

Je veux trier le tableau comme celui-ci

... 
2017-10-14 
2017-10-16 
2017-10-17 
2017-10-18 
2017-10-12 
2017-10-10 
2017-10-09 
.... 

Comment Je fais ça en utilisant MySQL?

+0

Avez-vous déjà essayé quelque chose? –

+1

Règle générale: "Montrez votre tentative, expliquez le comportement souhaité, le comportement actuel et la différence" – klutt

+1

http://idownvotedbecau.se/nomcve/ – apokryfos

Répondre

0

Essayez quelque chose comme ça

ORDER BY CASE 
      WHEN eventdate = Cast(now() AS DATE) THEN 1 
      WHEN eventdate < Cast(now() AS DATE) THEN -1 
      ELSE 0 
      END DESC, 
      case when eventdate < Cast(now() AS DATE) then eventdate end desc, 
      case when eventdate > Cast(now() AS DATE) then eventdate end asc 
0

Vous pouvez accomplir la commande que vous voulez en utilisant seulement deux CASE expressions. Le premier cas sépare les événements actuels et futurs des événements antérieurs. Le deuxième cas ordonne les événements actuels et futurs ascendants et descendants précédents.

SELECT 
    date 
FROM yourTable 
ORDER BY 
    CASE WHEN date >= CURDATE() THEN 0 ELSE 1 END, 
    CASE WHEN date >= CURDATE() 
     THEN UNIX_TIMESTAMP(date) ELSE -UNIX_TIMESTAMP(date) END; 

Sortie:

date 
1 14.10.2017 00:00:00 
2 16.10.2017 00:00:00 
3 17.10.2017 00:00:00 
4 18.10.2017 00:00:00 
5 12.10.2017 00:00:00 
6 10.10.2017 00:00:00 
7 09.10.2017 00:00:00 

Demo ici:

Rextester

0
order by 
    case when DateCol >= cast(now() as date) then DateCol 
    --     ^^ I use this cast is needed to ignore time part of comparing 
    else now() - DateCol 
    end 

SQL Fiddle Demo

+1

Cela semble plus de requête que nécessaire – Strawberry

+0

@Strawberry J'ajoute une autre façon aussi;). –

+0

Votre première requête est géniale, mais la seconde ne l'est pas. Vous devez toujours spécifier une commande. Les deux moitiés de l'union ne "collent" pas magiquement dans un ordre particulier. Je voudrais résoudre la requête d'union ou simplement l'enlever complètement. –

0

MySQL traite les booléens comme des nombres dans un contexte numérique. Ainsi, une simple façon est:

where (datecol >= curdate()) desc, -- put future dates first, 
     (case when datecol >= curdate() then datecol end) asc, 
     datecol desc 

J'aime avoir la première condition, il est donc très clair que l'ordre est destiné à être.