now() या CURRENT_TIMESTAMP इस उद्देश्य के लिए।
आपके प्रश्नों के भिन्न परिणामों का कारण यह है:
जब आप date . प्रकार के दो मान घटाते हैं , परिणाम एक integer है और abs() लागू होता है।
जब आप timestamp . प्रकार के दो मानों को घटाते हैं (या सिर्फ एक timestamp है ), परिणाम एक interval . है , और abs() उपयुक्त नहीं है। आप CASE . के साथ स्थानापन्न कर सकते हैं अभिव्यक्ति:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
या आप extract()
यूनिक्स epoch परिणामी interval . से जैसे @ क्रेग ने पहले ही प्रदर्शन कर दिया है। मैं उद्धृत करता हूं:"अंतराल मानों के लिए, अंतराल में सेकंड की कुल संख्या"। फिर आप abs() . का उपयोग कर सकते हैं फिर से:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
बड़े अंतराल के लिए दिनों को महीनों और वर्षों में जोड़कर अंतराल में अधिक मानवीय पठनीय प्रतिनिधित्व जोड़ देगा। लेकिन यह बिंदु के बगल में है:मान का उपयोग केवल छँटाई के लिए किया जाता है।
चूंकि आपका कॉलम टाइमस्टैम्प प्रकार का है, इसलिए आपको CURRENT_TIMESTAMP . का उपयोग करना चाहिए (या now() ) CURRENT_DATE . के बजाय , या आपको गलत परिणाम मिलेंगे (या "आज" के लिए भी गलत)।