sql >> データベース >  >> RDS >> PostgreSQL

タイムスタンプ(将来を含む)を現在からの絶対距離で並べ替えます

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



    1. プリペアドステートメントに配列を指定します

    2. (ローカルホストではなく)リモートコンピューターからMySQLにアクセスする方法は?

    3. 配列を使用したMySQLクエリ

    4. 外部キーとして列を追加すると、外部キー制約で参照されているERROR列が存在しません