now()またはCURRENT_TIMESTAMP> 目的のために。
クエリの結果が異なる理由は次のとおりです:
タイプdate
の2つの値を減算する場合 、結果はinteger
です およびabs()
タイプtimestamp
の2つの値を減算する場合 (または1つだけがtimestamp
です )、結果はinterval
になります 、およびabs()
該当しません。 CASE
に置き換えることができます 式:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
または、 extract()
UNIXのepoch
結果のinterval
から @Craigのようにすでに実証されています。 「間隔値の場合、間隔の合計秒数」を引用します。次に、abs()
を使用できます もう一度:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
>
より大きな間隔で日を月と年に合計することで、より人間が読める形式の表現を間隔に追加するだけです。しかし、それは重要なことではありません。値は並べ替えにのみ使用されます。
列のタイプはタイムスタンプであるため、CURRENT_TIMESTAMP
を使用する必要があります (またはnow()
)CURRENT_DATE
の代わりに 、または不正確な結果が得られます(または「今日」の場合は正しくありません)。