按最近的日期排序,然后过去

时间:2013-01-17 22:37:03

标签: mysql sql

我有一个艺术画廊页面,其中有一个展示多达5个展览的面板'在这个画廊'。有时可能有很多,它应该显示当前或即将到来的第一,然后诉诸过去的展览。

是否可以在一个查询中执行?

以下将给出那些与日期差异最接近的人,但我最终可能会在列表顶部找到过去的事件(因为如果是过去的一天,它显然比5天内即将发生的事件少)

SELECT   DATEDIFF(date_start, NOW()) as date_diff, exhibitions.*
FROM     events 
WHERE    event.gallery_id = XX
ORDER BY date_diff asc
LIMIT    5

3 个答案:

答案 0 :(得分:3)

date_diff返回过去事件的负值。这是一个修复:

SELECT   DATEDIFF(date_start, NOW()) as date_diff, exhibitions.*
FROM     events 
WHERE    event.gallery_id = XX
ORDER BY (case when date_diff < 0 then 1 else 0 end),
         abs(date_diff) asc
LIMIT    5

答案 1 :(得分:1)

您可以按date_start < CURDATE()订购,它将返回0或1,0将来,1过去,如果您订购结果ASC,那么它将确保将来的那些总是出现在过去之前

例如:

ORDER BY
  (date_start < CURDATE()) ASC,
  (greatest(date_start, CURDATE()) ASC,
  (least(date_start, CURDATE()) DESC

第一个排在过去之前的未来,第二个排序未来的ASC(最接近的第一个),第三个排序过去的DESC(最早的第一个)

(第二和第三个是交换)

答案 2 :(得分:-1)

通常,您无法在两个方向上对一列进行排序。如果您想通过即将到来的ASC订购过去的DESC,您可以使用技巧:

SELECT yourDateColumn,IF(yourDateColumn)<NOW(),DATEDIFF(yourDateColumn),NOW()) * -1000000000,UNIX_TIMESTAMP(STR_TO_DATE(CONVERT_TZ(e.startDate,e.timeZone,'Europe/Paris'), '%Y-%m-%d'))) AS diff FROM yourTable ORDER BY DIFF ASC;
相关问题