2012-07-09 2 views
3

У меня есть столбец даты, и я использую order by clause.Заказ MySql, связанный с сегодняшней датой

Я хочу показать записи рядом с сегодняшней датой сверху, а затем все записи с прошлым внизу.

Я хочу сделать это с помощью одного запроса.

Я попытался это

SELECT *, DATEDIFF(`date`, CURDATE()) AS diff FROM `post` order by diff 

Проблема с этим запросом это покажет запись с мимо первым и, если я использую нисходящее то запись далеко от сегодняшнего дня будет находиться на вершине.

Как я могу это достичь?

Любая помощь будет оценена по достоинству.

+0

если поле даты не может содержать дату в будущем, поэтому используйте 'SELECT * FROM после заказа по дате DESC' – amd

ответ

6

Вы должны быть в состоянии сделать это что-то вроде:

SELECT *, DATEDIFF(`date`, CURDATE()) AS diff FROM `post` 
order by CASE WHEN diff < 0 THEN 1 ELSE 0 END, diff 

Это приведет к тому, что любые даты в прошлом будут сортироваться после текущей даты или даты в будущем.

+0

Отлично ... спасибо вам большое. –

+0

Просто интересно, если можно сделать прошлые даты отсортированными в порядке убывания, чтобы последние даты отображались сразу после будущих дат. – designcise

+0

может кто-нибудь объяснить, как это работает? –

1

Вы должны ORDER BY Descendly так:

SELECT *, DATEDIFF(`date`, CURDATE()) AS diff 
FROM `post ORDER BY diff DESC; 
+0

Оператор говорит об этом. – xdazz

3

Попробуйте

SELECT *, DATEDIFF(`date`, CURDATE()) AS diff FROM `post` order by ABS(diff) 
+0

хороший улов - я думаю, что это на самом деле то, что ОП просил ... – Randy

+1

Это будет чередовать прошлые и будущие события, исходя из их расстояния отныне. Это не похоже на «все записи с прошлым внизу». –

+0

Он будет смешивать записи из прошлого с будущим. Я хочу, чтобы все записи были внизу. –

0

почему нет tjust обычного старого заказа даты?

SELECT *, DATEDIFF(`date`, CURDATE()) AS diff 
FROM `post ORDER BY date DESC; 
0

Поскольку вы не хотите, результаты, которые слишком далеко в будущем, просто удалите эти результаты из результирующего набора:

SELECT *, DATEDIFF(`date`, CURDATE()) AS diff FROM `post` 
WHERE `date` < date_add(CURDATE(), INTERVAL 1 DAY) 
ORDER BY diff DESC 
Смежные вопросы