按案例订购以获得此:-1、-2、-3、0、+1、+2、+3

ORDER BY CASE to get this: -1, -2, -3, 0, +1, +2, +3

在我的查询中,我想按以下方式排序:

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

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

-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

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

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

  1. SELECT(查询)as "xxx" FROM DUAL
  2. 案例 xxx
  3. (案例说明)
  4. 结束 过期
  5. 订购方式 过期

您需要在结果中给自己一些额外的列,以获得所需的结果以供 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 之前)。

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

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