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」に、テーブルを@tに置き換えると、これは機能するはずです。
私はこのorder by句でそれをハックしました:
ORDER BY CASE expiry >= CURRENT_DATE
WHEN true THEN expiry
ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
END
日付は今日から数年以内であるため、負の日付を将来に進めても安全です。次に、現在の日付からの距離が逆になります。
それは機能しますが、よりエレガントなソリューションがいいでしょう。