2012-09-13 63 views

回答

3

以下也將工作:

ORDER BY expiry < CURRENT_DATE, abs(expiry - CURRENT_DATE) 

然而這種形式將不使用的索引,以產生所需的順序的行。如果您的查詢就會從中受益(大部分選擇行從表或使用限制),那麼你就需要使用一個聯盟:如果您substitue「我」爲

SELECT ... WHERE ... AND expiry >= CURRENT_DATE ORDER BY expiry 
    UNION ALL 
SELECT ... WHERE ... AND expiry < CURRENT_DATE ORDER BY expiry DESC 
+0

+1當然!我最終使用了第一種解決方案,因爲查詢時間很長,現在速度可以接受。 – l0b0

1

我by子句周圍砍死這樣的順序:

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

由於日期是在幾年的今天之內,它的安全負日期的方式推入未來。然後它們與當前日期的距離相反。

它的工作原理,但更優雅的解決方案會很好。

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 

您差異計算和@噸爲您的表這應該工作