Oracle SQL में 2 दिनांक / समय के बीच अंतर की गणना करें


88

मेरे पास एक तालिका इस प्रकार है:

Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss

ओरेकल एसक्यूएल में दो तिथियों के बीच मैं घंटे मिनट और सेकंड (और संभवतः दिन) में अंतर कैसे शांत कर सकता हूं?

धन्यवाद


निकट-डुप्लिकेट: stackoverflow.com/questions/9322935/…

जवाबों:


118

आप Oracle में तारीखों को प्रतिस्थापित कर सकते हैं। यह आपको दिनों में अंतर देगा। घंटे, और इतने पर पाने के लिए 24 से गुणा करें।

SQL> select oldest - creation from my_table;

यदि आपकी तारीख को चरित्र डेटा के रूप में संग्रहीत किया जाता है, तो आपको इसे पहले तिथि प्रकार में बदलना होगा।

SQL> select 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') 
             - to_date('2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours 
       from dual;

DIFF_HOURS
----------
       2.5

नोट :

यह उत्तर Oracle डेटा प्रकार द्वारा दर्शाई गई तारीखों पर लागू होता है DATE। Oracle में एक डेटा प्रकार भी होता है TIMESTAMP, जो एक तिथि (समय के साथ) का भी प्रतिनिधित्व कर सकता है। यदि आप TIMESTAMPमूल्यों को घटाते हैं, तो आपको ए INTERVAL; संख्यात्मक मान निकालने के लिए, EXTRACTफ़ंक्शन का उपयोग करें ।


3
क्या कुछ बिंदु पर ओरेकल के व्यवहार में बदलाव आया है? जब मैं एक तिथि को दूसरे से घटाता हूं तो मुझे एक INTERVALडेटा प्रकार मिलता है , न कि एक साधारण फ्लोट।

2
@JonofAllTrades: नहीं, जब आप प्रकार के मूल्यों को घटाते हैं, तो आपको DATEदिनों की संख्या मिलती है (ए NUMBER)। हालांकि, यदि आप TIMESTAMPमूल्यों को घटाते हैं, तो आप प्राप्त करते हैं INTERVALDS। संभवतः आप मूल्यों के साथ काम कर रहे हैं TIMESTAMPऔर नहीं DATE। मैंने उत्तर संपादित किया।
sleske

अपने नोट के बारे में - दोनों DATEऔर TIMESTAMPडेटा प्रकारों में एक समय (घंटे, मिनट और सेकंड) घटक होता है।TIMESTAMPइसमें एक अंश सेकंड का समय घटक (और संभावित समय क्षेत्र घटक) भी होता है।
MT0

"यह आपको दिनों में अंतर देगा।" क्या आप ओरेकल दस्तावेज़ से लिंक कर सकते हैं?
रोलैंड


16
declare
strTime1 varchar2(50) := '02/08/2013 01:09:42 PM';
strTime2 varchar2(50) := '02/08/2013 11:09:00 PM';
v_date1 date := to_date(strTime1,'DD/MM/YYYY HH:MI:SS PM');
v_date2 date := to_date(strTime2,'DD/MM/YYYY HH:MI:SS PM');
difrence_In_Hours number;
difrence_In_minutes number;
difrence_In_seconds number;
begin
    difrence_In_Hours   := (v_date2 - v_date1) * 24;
    difrence_In_minutes := difrence_In_Hours * 60;
    difrence_In_seconds := difrence_In_minutes * 60;

    dbms_output.put_line(strTime1);        
    dbms_output.put_line(strTime2);
    dbms_output.put_line('*******');
    dbms_output.put_line('difrence_In_Hours  : ' || difrence_In_Hours);
    dbms_output.put_line('difrence_In_minutes: ' || difrence_In_minutes);
    dbms_output.put_line('difrence_In_seconds: ' || difrence_In_seconds);        
end ;

उम्मीद है की यह मदद करेगा।


14
select 
    extract( day from diff ) Days, 
    extract( hour from diff ) Hours, 
    extract( minute from diff ) Minutes 
from (
        select (CAST(creationdate as timestamp) - CAST(oldcreationdate as timestamp)) diff   
        from [TableName] 
     );

यह आपको डेज, आवर्स और मिनट्स के रूप में तीन कॉलम देगा।


8

आप भी इसे आजमा सकते हैं:

select to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+(end_date - start_date),'hh24:mi:ss')
       as run_time from some_table;

यह अधिक मानवीय पठनीय रूप में समय प्रदर्शित करता है, जैसे: 00:01:34। यदि आपको भी दिनों की जरूरत है तो आप डीडी को अंतिम स्वरूपण स्ट्रिंग में जोड़ सकते हैं।


7

आप उपयोग कर सकते हैं to_timestamp फ़ंक्शन को दिनांक को टाइमस्टैम्प में बदलने और एक घटिया ऑपरेशन करने के लिए।

कुछ इस तरह:

SELECT 
TO_TIMESTAMP ('13.10.1990 00:00:00','DD.MM.YYYY HH24:MI:SS')  - 
TO_TIMESTAMP ('01.01.1990:00:10:00','DD.MM.YYYY:HH24:MI:SS')
FROM DUAL

मैंने to_date और to_timestamp दोनों की कोशिश की है और दोनों ने मुझे दिनों में एक उत्तर दिया है, इसलिए नीचे राउंड किया गया है यदि अंतर 1 घंटे का है तो मुझे 0 का उत्तर मिलता है, इसे 24 से गुणा करना 0. मैं सही उत्तर प्राप्त करता हूं यदि कोई टाइप करता है तारीख का समय लेकिन मैं 25 मीटर पंक्तियों के लिए ऐसा नहीं कर सकता। कोई विचार?
स्टीव

3
टाइमस्टैम्प के बीच एक विकल्प का उपयोग करके यह आपको "DAYS HOUR: MINS: SECS.milisecs" जैसे प्रारूप में एक और टाइमस्टैम्प लौटाएगा। आप अपनी जरूरत का मूल्य पाने के लिए इसे
काट सकते हैं

6
टाइमस्टैम्प के बीच घटाव एक INTERVAL डेटाटाइप देता है। आप एक अंतराल के विभिन्न भागों को वापस लाने के लिए EXTRACT फ़ंक्शन का उपयोग कर सकते हैं। उदाहरण के लिए (घंटे (टाइमस्टैम्प '2009-12-31 14:00:00' - टाइमस्टैम्प '2009-12-31 12:15:00') hr दोहरे से; नोट: यह केवल HOUR हिस्सा दिखाता है, इसलिए यदि अंतर 1 दिन और 1 घंटा है, तो यह 1 नहीं 25 दिखाएगा।
गैरी मायर्स

5

अपने कंप्यूटर के सिस्टम दिनांक से आयु की गणना करें

SELECT HIREDATE||'        '||SYSDATE||'       ' ||
TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) ||' YEARS '||
TRUNC((MONTHS_BETWEEN(SYSDATE,HIREDATE))-(TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)*12))||
'MONTHS' AS "AGE  "  FROM EMP;

3
select days||' '|| time from (
SELECT to_number( to_char(to_date('1','J') +
    (CLOSED_DATE - CREATED_DATE), 'J') - 1)  days,
   to_char(to_date('00:00:00','HH24:MI:SS') +
      (CLOSED_DATE - CREATED_DATE), 'HH24:MI:SS') time
 FROM  request  where REQUEST_ID=158761088 );

3

अलंकृत 11 ग्रा

SELECT end_date - start_date AS day_diff FROM tablexxx
suppose the starT_date end_date is define in the tablexxx

2

यदि आप ' your_table ' से दो तिथियों का चयन करते हैं और चाहते हैं कि परिणाम एक एकल स्तंभ आउटपुट के रूप में देखें (उदाहरण के लिए। दिन - hh: mm: ss ') तो आप कुछ इस तरह का उपयोग कर सकते हैं। पहले आप इन दो तिथियों के बीच के अंतराल की गणना कर सकते हैं और उसके बाद उस अंतराल से आपके लिए आवश्यक सभी डेटा निर्यात करें:

         select     extract (day from numtodsinterval (second_date
                                                   - add_months (created_date,
                                                                 floor (months_between (second_date,created_date))),
                                                   'day'))
             || ' days - '
             || extract (hour from numtodsinterval (second_date
                                                    - add_months (created_date,
                                                                  floor (months_between (second_date,created_date))),
                                                    'day'))
             || ':'
             || extract (minute from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
             || ':'
             || extract (second from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
     from    your_table

और वह आपको इस तरह से परिणाम देना चाहिए: 0 दिन - 1:14:55


1
select (floor(((DATE2-DATE1)*24*60*60)/3600)|| ' : ' ||floor((((DATE2-DATE1)*24*60*60) -floor(((DATE2-DATE1)*24*60*60)/3600)*3600)/60)|| '  ' ) as time_difference from TABLE1 

1

यदि आप ऐसा कुछ चाहते हैं जो थोड़ा सरल दिखता है, तो पिछले 1 मिनट में हुई किसी तालिका की घटनाओं को खोजने के लिए यह प्रयास करें:

इस प्रविष्टि के साथ आप दशमलव मानों के साथ तब तक फ़ील कर सकते हैं जब तक कि आपको वह मिनट मान नहीं मिल जाता जो आप चाहते हैं। जहाँ तक sysdate के महत्वपूर्ण अंकों का संबंध है, तो मान .0007 1 मिनट का होता है। आप चाहते हैं कि किसी भी अन्य मूल्य प्राप्त करने के लिए उस के गुणकों का उपयोग कर सकते हैं:

select (sysdate - (sysdate - .0007)) * 1440 from dual;

परिणाम 1 (मिनट) है

फिर जाँच करना एक साधारण बात है

select * from my_table where (sysdate - transdate) < .00071;

1
(TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*60*24 sum_seconds,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*24 sum_minutes,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*24 sum_hours,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi')) sum_days 

1
select to_char(actual_start_date,'DD-MON-YYYY hh24:mi:ss') start_time,
to_char(actual_completion_date,'DD-MON-YYYY hh24:mi:ss') end_time,
floor((actual_completion_date-actual_start_date)*24*60)||'.'||round(mod((actual_completion_date-actual_start_date)*24*60*60,60)) diff_time
from fnd_concurrent_requests 
order by request_id desc;  

0
$sql="select bsp_bp,user_name,status,
to_char(ins_date,'dd/mm/yyyy hh12:mi:ss AM'),
to_char(pickup_date,'dd/mm/yyyy hh12:mi:ss AM'),
trunc((pickup_date-ins_date)*24*60*60,2),message,status_message 
from valid_bsp_req where id >= '$id'"; 

0

यह तिथियों के बीच के समय की गणना करेगा:

SELECT
  (TO_CHAR( TRUNC (ROUND(((sysdate+1) - sysdate)*24,2))*60,'999999')
  +
  TO_CHAR(((((sysdate+1)-sysdate)*24)- TRUNC(ROUND(((sysdate+1) - sysdate)*24,2)))/100*60 *100, '09'))/60
FROM dual

0

यहाँ एक और विकल्प है:

with tbl_demo AS
    (SELECT TO_DATE('11/26/2013 13:18:50', 'MM/DD/YYYY HH24:MI:SS') dt1
   , TO_DATE('11/28/2013 21:59:12', 'MM/DD/YYYY HH24:MI:SS') dt2 
     FROM dual)
SELECT dt1
     , dt2
     , round(dt2 - dt1,2) diff_days
     , round(dt2 - dt1,2)*24 diff_hrs
     , numtodsinterval((dt2 - dt1),'day') diff_dd_hh_mm_ss
  from tbl_demo;

0

एकल क्वेरी जो दो टाइमस्टैम्प कॉलम का समय अंतर लौटाएगी:

select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff 
from MAIL_NOTIFICATIONS;

0

यदि आप तालिका और स्तंभ का उपयोग करने से दिनांक स्थगित करना चाहते हैं।

SELECT TO_DATE( TO_CHAR(COLUMN_NAME_1, 'YYYY-MM-DD'), 'YYYY-MM-DD') - 
       TO_DATE(TO_CHAR(COLUMN_NAME_2, 'YYYY-MM-DD') , 'YYYY-MM-DD')  AS DATEDIFF       
FROM TABLE_NAME;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.