我有一个date
字段显示为从今天开始的天数。因此2055-01-01
和1950-01-01
将分别显示为正数和负数。现在我希望对这些进行排序,以便非负数按升序排列,然后负数按降序排列。例如:
0
1
2
3
4
-1
-2
-3
我有一个date
字段显示为从今天开始的天数。因此2055-01-01
和1950-01-01
将分别显示为正数和负数。现在我希望对这些进行排序,以便非负数按升序排列,然后负数按降序排列。例如:
0
1
2
3
4
-1
-2
-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
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' 代替你的 diff 计算,用 @t 代替你的表,这应该可以
我已经用这个 order by 子句解决了它:
ORDER BY CASE expiry >= CURRENT_DATE
WHEN true THEN expiry
ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
END
由于日期在今天的几年内,因此将负日期推到未来是安全的。然后他们与当前日期的距离被反转。
它有效,但更优雅的解决方案会很好。