在我的查询中,我想通过此命令:
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
太糟糕了,我只是在尝试使用的所有内容中遇到大量语法错误:-)它是如何工作的?
答案 0 :(得分:0)
您应该将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
是你关心的人。 numberAbs
和filter
使您首先按负值过滤,然后从那里开始计数(因此-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