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
. के बजाय , या आपको गलत परिणाम मिलेंगे (या "आज" के लिए भी गलत)।