按案例排序得到:-1,-2,-3,0,+ 1,+ 2,+ 3

时间:2015-04-17 15:26:54

标签: mysql sql-order-by

在我的查询中,我想通过此命令:

DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH))

以上陈述返回负值和正值。更确切地说,未来日期为负,过去日期为正,当前日期为零。我用它来计算服务的到期日期。您可以在下面找到输出的注释示例:

-1 (expires tomorrow)
-10 (expires in 10 days)
-20 (expires in 20 days)
0 (expires today)
+1 (expired yesterday)
+10 (expired 10 days ago)
+20 (expired 20 days ago)

问题在于我想以与您在上面看到的完全相同的方式进行ORDER BY结果。我正在尝试使用CAST()和ABS()但没有成功。我认为这是因为没有标准功能来获得我想要的东西。说我很确定我可以使用ORDER BY CASE解决这个问题,如下所示。

在你问它伪代码之前。我不是在我的查询中假装使用它:

ORDER BY CASE WHEN X <= 0 
THEN
ODER BY CASE WHEN X > 0

太糟糕了,我只是在尝试使用的所有内容中遇到大量语法错误:-)它是如何工作的?

3 个答案:

答案 0 :(得分:0)

您应该将ORDER BY放在查询的末尾

  1. 选择(查询)为“xxx” FROM DUAL
  2. CASE xxx
  3. (案例说明)
  4. END AS 到期
  5. ORDER BY 到期

答案 1 :(得分:0)

您需要在结果中添加一些额外的列,以便将所需的结果提供给ORDER by。

例如:

SELECT (values you care about),
    DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH)) AS number,
    ABS(DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH))) AS numberAbs,
    CASE WHEN 
        DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH)) < 0
            THEN 0 ELSE 1 END AS filter
ORDER BY filter, numberAbs

这里number是你关心的人。 numberAbsfilter使您首先按负值过滤,然后从那里开始计数(因此-1在-10之前)。

可能可以清理一下,但这应该包括如何获得您似乎正在寻找的结果。

答案 2 :(得分:0)

http://sqlfiddle.com/#!9/5a0dd/6

SELECT id, DATEDIFF(CURDATE(), DATE_ADD(`date`, INTERVAL cycle MONTH)) idx
FROM test
ORDER BY IF(idx<0,-idx/1000,IF(idx=0,0.1, idx)) ASC