जब आप एक टाइमस्टैम्प को दूसरे से घटाते हैं तो परिणाम एक आंतरिक अंतराल डेटा प्रकार होता है, लेकिन आप इसे 'अंतराल दिन से सेकंड' के रूप में मान सकते हैं:
select
(localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
from random us;
HOURSPASSED
-------------------
+08 15:26:54.293892
'+08' (मेरे सत्र समय क्षेत्र में) दिनों की संख्या है, यूटीसी ऑफसेट नहीं; यही वह मान है, क्योंकि जब आप किसी स्ट्रिंग को दिनांक या टाइमस्टैम्प में कनवर्ट करते हैं और केवल समय भाग प्रदान करते हैं, तो दिनांक भाग डिफ़ॉल्ट रूप से चालू माह के पहले दिन पर आ जाता है:
<ब्लॉकक्वॉट>डिफ़ॉल्ट दिनांक मान निम्नानुसार निर्धारित किए जाते हैं:
- वर्ष चालू वर्ष है, जैसा कि SYSDATE द्वारा लौटाया गया है।
- महीना चालू माह है, जैसा कि SYSDATE द्वारा लौटाया गया है।
- दिन 01 (महीने का पहला दिन) है।
- घंटा, मिनट और सेकंड सभी 0 हैं।
इन डिफ़ॉल्ट मानों का उपयोग उस क्वेरी में किया जाता है जो दिनांक मानों का अनुरोध करती है जहां दिनांक स्वयं निर्दिष्ट नहीं है ...
इसलिए मैं वास्तव में तुलना कर रहा हूं:
select localtimestamp, to_timestamp(us.STARTDATETIME,'hh24:mi:ss')
from random us;
LOCALTIMESTAMP TO_TIMESTAMP(US.STARTDATET
-------------------------- --------------------------
2017-08-09 23:26:54.293892 2017-08-01 08:00:00.000000
आप सीधे अंतराल को प्रारूपित नहीं कर सकते हैं, लेकिन आप समय के तत्वों को निकाल सकते हैं और उन्हें अलग से प्रारूपित कर सकते हैं, और उन्हें जोड़ सकते हैं।
select to_char(extract(hour from (localtimestamp
- to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
||':'|| to_char(extract(minute from (localtimestamp
- to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
||':'|| to_char(extract(second from (localtimestamp
- to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
as hourspassed
from random us;
HOURSPASSED
-----------
15:26:54
एक ही अंतराल की बार-बार गणना करना थोड़ा बेकार और प्रबंधित करने में कठिन लगता है, इसलिए आप इसे इनलाइन दृश्य या CTE में कर सकते हैं:
with cte (diff) as (
select localtimestamp - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss')
from random us
)
select to_char(extract(hour from diff), 'FM00')
||':'|| to_char(extract(minute from diff), 'FM00')
||':'|| to_char(extract(second from diff), 'FM00')
as hourspassed
from cte;
HOURSPASSED
-----------
15:26:54
आप टाइमस्टैम्प के बजाय तिथियों का भी उपयोग कर सकते हैं; घटाव तब आपको पूरे और भिन्नात्मक दिनों के साथ एक संख्या के रूप में अंतर देता है:
select current_date - to_date(us.STARTDATETIME, 'hh24:mi') as hourspassed
from random us;
HOURSPASSED
-----------
8.64368056
इसे प्रारूपित करने का सबसे आसान तरीका है कि इसे किसी ज्ञात मध्यरात्रि समय में जोड़ा जाए और फिर to_char()
का उपयोग किया जाए। :
select to_char(date '1970-01-01'
+ (current_date - to_date(us.STARTDATETIME, 'hh24:mi')),
'HH24:MI:SS') as hourspassed
from random us;
HOURSPAS
--------
15:26:54
मैं current_date
with के साथ फंस गया हूं localtimestamp
. के निकटतम मिलान के रूप में; आप वास्तव में systimestamp
. चाह सकते हैं और/या sysdate
. (यहां अंतर पर अधिक।)