Başlangıç > Database, Forms, Oracle, PL/SQL, Reports > pl/sql de iki tarih arası farkı bulma

pl/sql de iki tarih arası farkı bulma


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.

Reklamlar
  1. 24 Eylül 2010, 16:20

    Bu çalışma birçok tarih için doğru sonuç versede bazı tarihlerde sıkıntı yaşanmaktadır.Örneğin 26.07.1999 – 26.07.2010 tarihleri arası yanlış sonuç vermektedir.Altaki kodda doğru örneği vardır.”0.032258064516129″ bu rakam önemlidir.Çünkü iki gün arasındaki fark budur ve şu sql ile bulunur. “SELECT MONTHS_BETWEEN( SYSDATE,SYSDATE-1) FROM DUAL;”

    SELECT TRUNC(MONTHS_BETWEEN(tar2, tar1) / 12) yil,
    TRUNC(MOD(MONTHS_BETWEEN(tar2, tar1), 12)) ay,
    TRUNC((MONTHS_BETWEEN(tar2, tar1) –
    TRUNC(MONTHS_BETWEEN(tar2, tar1))) / 0.032258064516129) gun
    into t_yil, t_ay, t_gun
    FROM dual;

    Beğen

  2. 24 Eylül 2010, 16:56

    Yorum için teşekkürler. Sorunlu olan sql commetli hale alındı ve gönderdiğin yeni sqle göre konuyu güncelledim.

    Beğen

  3. kader
    16 Şubat 2012, 19:14

    SELECT TRUNC(MONTHS_BETWEEN(sysdate, ‘16.02.2011’) / 12) yil,
    TRUNC(MOD(MONTHS_BETWEEN(sysdate, ‘16.02.2011’), 12)) ay,
    TRUNC((MONTHS_BETWEEN(sysdate, ‘16.02.2011’) –
    TRUNC(MONTHS_BETWEEN(sysdate, ‘16.02.2011’))) / 0.032258064516129) gun
    –into t_yil, t_ay, t_gun
    FROM dual;
    1,0,0

    cıkyor:(

    Beğen

    • 04 Mart 2012, 16:41

      Merhaba
      Yazdığım kodlara dikkat ettiysen verilen tarih değerleri format olarak hep “dd-mm-yyyy hh24:mi:ss” şeklindedir. Bu durum sysdate default formatında da böyledir. Fakat senin gönderdiğin kod için bitiş tarihi değerinde sysdate ve başlangıç tarihi değerinde ise “16.02.2011” değeri mevcut yani işlem yapılacak olan tarih değerleri format olarak tutarlı değil. sysdate içeriğinde format olarak “dd-mm-yyyy hh24:mi:ss” değeri var fakat senin sabit verdiğin tarih için sadece “dd-mm-yyyy” değeri mevcut. Bu sebeple tarih hesaplamasında hata olur. Yani senin verdiğin tarih için ilave olarak “dd-mm-yyyy hh24:mi:ss” formatına uygun saat dakika ve saniye bilgileri ile işlemini kontrol edersen sorun çözülecektir.
      Kolay gelsin.

      Beğen

  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: