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.