4

date今日からの日数として表示されるフィールドがあります。そのため2055-01-01、 と1950-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」に、テーブルを@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 に答える