你对这个问题有类似的问题
Tricky "grouped" ordering in SQL
但似乎无法使用日期
我的表格
Car_ID Car_Brand Car_Model Car_launch_date
1 Ford Fiesta 12-12-2011
2 Ford Mustang 09-04-2008
3 Ford Focus 10-02-2012
4 Honda Civic 11-05-2012
6 Honda Jazz 02-05-2011
7 Toyota Prius 11-10-2011
我希望我的搜索结果按照最接近现在的未来日期排序,然后是最接近现在的过去日期(并按品牌分组)
我希望我的输出是这样的:
Car_ID Car_Brand Car_Model Car_launch_date
7 Toyota Prius 11-10-2011
1 Ford Fiesta 12-12-2011
3 Ford Focus 10-02-2012
2 Ford Mustang 09-04-2008
4 Honda Civic 11-05-2012
6 Honda Jazz 02-05-2011
答案 0 :(得分:1)
您在数据库中的日期是DATE
个对象还是字符串?因为如果您尝试将它们作为字符串进行排序,那将无效!
如果日期为DATE
s,请尝试:
SELECT * from my_table
ORDER BY Car_Brand DESC,
Car_launch_date < NOW(),
ABS(DATEDIFF(Car_launch_date, NOW()))
如果它们是字符串,请尝试:
SELECT * from my_table
ORDER BY Car_Brand DESC,
DATE(Car_launch_date) < NOW(),
ABS(DATEDIFF(DATE(Car_launch_date), NOW()))
如果您在订单中指定了多个列,则按第一列排序,然后按第一列排序,如果第一列中的值相同。
这个命令由 - 那么汽车品牌 - 日期是否过去。 Falses是先订购的。 (那么未来首先),然后 - 日期的绝对差异(最小的数字)
注意:我放了Car_Brand DESC
(反向alpha顺序)因为你就是这样的。
感谢OP发现您想要更复杂的订单。但我认为这种方式更好:)
答案 1 :(得分:0)
使用以前的帖子作为补充,更好的答案是:
GROUP BY Car_Brand
ORDER BY
CASE WHEN Car_launch_date >= NOW() THEN 0 ELSE 1 END,
CASE WHEN Car_launch_date >= NOW() THEN DATEDIFF(Car_launch_date, NOW()) ELSE DATEDIFF(NOW(), Car_launch_date) END
查询使用条件语句首先确定它是未来还是过去的日期。如果它是未来,它输出0并经过它输出1,所以未来的日期将排序第一,过去的日期排序第二。接下来是另一个案例陈述,用于检测如何计算现在和发布日期之间的天数差异。