ওরাকল এসকিউএলে 2 তারিখ / বারের মধ্যে পার্থক্য গণনা করুন


89

নীচে আমার একটি টেবিল রয়েছে:

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/...

উত্তর:


120

আপনি ওরাকলে তারিখগুলি বিয়োগ করতে পারেন। এটি আপনাকে দিনের মধ্যে পার্থক্য দেবে। ঘন্টা পাওয়ার জন্য 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

দ্রষ্টব্য :

এই উত্তরটি ওরাকল ডেটা ধরণের দ্বারা প্রতিনিধিত্ব করা তারিখগুলিতে প্রযোজ্য DATE। ওরাকলের একটি ডেটা টাইপও রয়েছে TIMESTAMP, যা একটি তারিখ (সময়ের সাথে) উপস্থাপন করতে পারে। আপনি যদি TIMESTAMPমানগুলি বিয়োগ করেন তবে আপনি একটি পাবেন INTERVAL; সংখ্যার মানগুলি বের করতে, EXTRACTফাংশনটি ব্যবহার করুন ।


4
কোনও পর্যায়ে ওরাকলের আচরণে কোনও পরিবর্তন হয়েছে? আমি যখন অন্যটির থেকে একটি তারিখ বিয়োগ করি তখন আমি একটি INTERVALডেটা টাইপ পাই , কোনও সাধারণ ভাসা নয়।

4
@ জোনফএল ট্রেডস: না, যখন আপনি টাইপের মানগুলি বিয়োগ করেন DATE, আপনি দিনগুলি (ক হিসাবে NUMBER) পান। তবে, যদি আপনি TIMESTAMPমানগুলি বিয়োগ করেন তবে আপনি পাবেন INTERVALDS। সম্ভবত আপনি সাথে কাজ করেন, TIMESTAMPএবং DATEমান। আমি উত্তর সম্পাদনা করেছি।
sleske

আপনার নোট সম্পর্কে - উভয় DATEএবং TIMESTAMPডেটা ধরণের একটি সময় (ঘন্টা, মিনিট এবং সেকেন্ড) থাকে। TIMESTAMPএছাড়াও একটি ভগ্নাংশ সেকেন্ড সময় উপাদান (এবং সম্ভাব্য সময় অঞ্চল উপাদান) রয়েছে।
এমটি0

"এটি আপনাকে দিনের মধ্যে পার্থক্য দেবে।" আপনি দয়া করে ওরাকল ডকুমেন্টেশনে লিঙ্ক করতে পারেন?
রোল্যান্ড


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

আপনি তারিখগুলি টাইমস্ট্যাম্পগুলিতে রূপান্তর করতে এবং একটি বিকল্প অপারেশন সম্পাদন করতে টো টাইমস্ট্যাম্প ফাংশন ব্যবহার করতে পারেন।

কিছুটা এইরকম:

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

আমি টু_ডেট এবং টো-টাইমস্ট্যাম্প উভয়ই চেষ্টা করে দেখেছি এবং উভয়ই আমাকে দিনগুলিতে উত্তর দেয়, গোল করে নিচে হয় তাই যদি পার্থক্যটি 1 ঘন্টা হয় তবে আমি 0 টির উত্তর পাই, এটি 24 দিয়ে গুণ করে 0 দিবে আমি টাইপ করলে সঠিক উত্তর পাই না তারিখের সময় তবে আমি 25 মিটার সারিগুলির জন্য এটি করতে পারি না। কোন চিন্তা?
স্টিভ

4
টাইমস্ট্যাম্পগুলির মধ্যে বিভাজন ব্যবহার করে এটি আপনাকে "DAYS HOUR: MINS: SECS.milisecs" এর মতো ফর্ম্যাটে আর একটি টাইমস্ট্যাম্প ফিরিয়ে আনবে। আপনার প্রয়োজনীয় মানটি পেতে আপনি এটি কেটে ফেলতে পারেন
হাইলিয়ান

6
টাইমস্ট্যাম্পগুলির মধ্যে বিয়োগটি একটি ইন্টারভাল ডেটাটাইপ দেয়। একটি বিরতির বিভিন্ন অংশ ফেরত দিতে আপনি এক্সট্রা্যাক্ট ফাংশনটি ব্যবহার করতে পারেন যেমন নিষ্ক্রিয় নির্বাচন করুন (ঘন্টা টাইমস্ট্যাম্প '২০০৯-১২-১ 14 14:00:00' - টাইমস্ট্যাম্প '২০০৯-১২-১১ 12:15:00')) ঘন্টা দ্বৈত থেকে; দ্রষ্টব্য: এটি কেবল HOUR অংশটি দেখায়, সুতরাং পার্থক্যটি যদি 1 দিন 1 ঘন্টা হয় তবে এটি 25 না 1 টি দেখায়
গ্যারি মায়ার্স

5

আপনার কম্পিউটারের সিস্টেমের তারিখ HIREDATE থেকে বয়স গণনা করুন

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 ' থেকে দুটি তারিখ নির্বাচন করেন এবং ফলাফলটি একটি একক কলাম আউটপুট হিসাবে দেখতে চান (যেমন ' দিন - এইচএইচ: মিমি: এসএস ') আপনি এরকম কিছু ব্যবহার করতে পারেন। প্রথমে আপনি এই দুটি তারিখের মধ্যবর্তী ব্যবধান গণনা করতে পারেন এবং তার পরে সেই অন্তর থেকে আপনার প্রয়োজনীয় সমস্ত ডেটা রফতানি করতে পারেন:

         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

যদি আপনি এমন কিছু চান যা কিছুটা সহজ দেখায় তবে গত এক মিনিটে ঘটে যাওয়া টেবিলের ইভেন্টগুলি অনুসন্ধান করার জন্য এটি চেষ্টা করুন:

আপনি চান মিনিটের মান না পাওয়া পর্যন্ত এই এন্ট্রি দিয়ে আপনি দশমিক মানগুলি নিয়ে বেড়াতে পারেন। মান .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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.