我有一个date
字段,显示为从今天开始的天数。因此2055-01-01
和1950-01-01
将分别显示为正数和负数。现在我想要对这些进行排序,以便非负数首先按升序排列,然后负数按降序排列。例如:
0
1
2
3
4
-1
-2
-3
答案 0 :(得分:3)
以下内容也适用:
ORDER BY expiry < CURRENT_DATE, abs(expiry - CURRENT_DATE)
但是,此表单不会使用索引按所需顺序生成行。如果您的查询将从中受益(从表中选择大多数行或使用限制),那么您将需要使用联合:
SELECT ... WHERE ... AND expiry >= CURRENT_DATE ORDER BY expiry
UNION ALL
SELECT ... WHERE ... AND expiry < CURRENT_DATE ORDER BY expiry DESC
答案 1 :(得分:2)
select * from @t
order by
case when i >= 0 then 0 else 1 end,
case when i >= 0 then i else abs(i) end
如果你将'i'替换为差异计算而将@t替换为你的表,那么这应该可以正常工作
答案 2 :(得分:1)
我用这个order by子句来攻击它:
ORDER BY CASE expiry >= CURRENT_DATE
WHEN true THEN expiry
ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
END
由于日期是在今天的几年内,所以将负面日期推向未来是安全的。然后他们与当前日期的距离就会反转。
它有效,但更优雅的解决方案会很好。