Arşiv

Posts Tagged ‘iki’

pl/sql de iki tarih arası farkı bulma

28 Haziran 2010 4 yorum

Merhaba,

Bazı özel durumlar için yazdığımız function , procedure ya da declare içinde iki tarih arasındaki farkı bulmamız gerekiyor.Bu işlem için basit olarak “tarih1-tarih2” gibi bir satır ile işlem çözülebilir. Fakat bu iki tarih arasındaki farkı daha detaylı görmek (yil,ay,gün,saat,dk,sn gibi)için aşağıdaki declare satırı kullanılabilinir.Bu declare satırı ihtiyaç durumunda bir function yapılabilir ya da bir procedure içinde kullanılabilinir.

DECLARE
  yil             NUMBER;
  ay              NUMBER;
  gun             NUMBER;
  saat            NUMBER;
  dk              NUMBER;
  san             NUMBER;
  baslangic_tarih DATE;
  bitis_tarih     DATE;
  sonuc           VARCHAR2(1000);
BEGIN

  baslangic_tarih := to_date('11-09-2009 20:15:10', 'dd-mm-yyyy hh24:mi:ss');
  bitis_tarih     := SYSDATE;
  /*************************************************************************************
-- Eski okuma bilgisi. Tam gün hesaplaması olmadığı için birgün eksik bilgi geliyordu.
-- Aşağıdaki yeni sql ile bu sorun çözüldü.
--    BEGIN
--      SELECT to_number(substr(zaman, 1, 4)) - 2000 yil,
--             to_number(substr(zaman, 6, 2)) - 01 ay,
--             to_number(substr(zaman, 9, 2)) - 01 gun,
--             substr(zaman, 12, 2) saat,
--             substr(zaman, 15, 2) dk,
--             substr(zaman, 18, 2) san
--        INTO yil,
--             ay,
--             gun,
--             saat,
--             dk,
--             san
--        FROM (SELECT to_char(to_date('20000101', 'YYYYMMDD') + (SELECT (bitis_tarih - baslangic_tarih) fark FROM dual), 'YYYY MM DD HH24:MI:SS') zaman
--                FROM dual)
--       WHERE rownum < 2;
--    EXCEPTION
--      WHEN OTHERS THEN
--        dbms_output.put_line('Sql de bir hata ile karşılaşıldı.');
--    END;
  **************************************************************************************/

  BEGIN
    SELECT trunc(months_between(bitis_tarih, baslangic_tarih) / 12) yil,
           trunc(MOD(months_between(bitis_tarih, baslangic_tarih), 12)) ay,
           trunc((months_between(bitis_tarih, baslangic_tarih) - trunc(months_between(bitis_tarih, baslangic_tarih))) / 0.032258064516129) gun,
           substr(zaman, 12, 2) saat,
           substr(zaman, 15, 2) dk,
           substr(zaman, 18, 2) san
      INTO yil,
           ay,
           gun,
           saat,
           dk,
           san
      FROM (SELECT to_char(to_date('20000101', 'YYYYMMDD') + (SELECT (bitis_tarih - baslangic_tarih) fark FROM dual), 'YYYY MM DD HH24:MI:SS') zaman
              FROM dual)
     WHERE rownum < 2;
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Sql de bir hata ile karşılaşıldı.');
  END;
  sonuc := 'İki Tarih Arası Fark' || ' ( ' || to_char(bitis_tarih, 'dd-mm-yyyy hh24:mi:ss') || ' - ' ||
           to_char(baslangic_tarih, 'dd-mm-yyyy hh24:mi:ss') || ' )' || chr(10);
  sonuc := sonuc || ' ' || to_char(yil, '999') || ' Yıl ' || to_char(ay, '99') || ' Ay ' || to_char(gun, '99') || ' Gün ' || to_char(saat, '09') ||
           ' Saat ' || to_char(dk, '09') || ' Dakika ' || to_char(san, '09') || ' Saniye';

  dbms_output.put_line(sonuc);

END;

Görüldüğü gibi yazılan bu declare da iki tarih arasındaki tüm farklar alınmış durumdadır.Artık ihtiyacımız olan fark hangisi ise istenildiği gibi kullanılabilir.