4

我有一个date字段显示为从今天开始的天数。因此2055-01-011950-01-01将分别显示为正数和负数。现在我希望对这些进行排序,以便非负数按升序排列,然后负数按降序排列。例如:

0
1
2
3
4
-1
-2
-3
4

3 回答 3

4

以下也将起作用:

 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
于 2012-09-13T08:15:09.333 回答
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' 代替你的 diff 计算,用 @t 代替你的表,这应该可以

于 2012-09-13T08:26:07.460 回答
1

我已经用这个 order by 子句解决了它:

ORDER BY CASE expiry >= CURRENT_DATE
         WHEN true THEN expiry
         ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
         END

由于日期在今天的几年内,因此将负日期推到未来是安全的。然后他们与当前日期的距离被反转。

它有效,但更优雅的解决方案会很好。

于 2012-09-13T07:55:20.387 回答