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の代わりに 、または不正確な結果が得られます(または「今日」の場合は正しくありません)。