Oracle Ders 24 – Single Row Functions – 04
Merhaba Arkadaslar ,
Single Row Function konumuza devam ediyoruz ve bu yazimda Date(Tarih) Fonksiyonlarindan bahsedecegim. Oracle da varsayilan tarih formati DD-MON-YY dir , DD gun, MON ayin YY de yilin simgesidir.Bu yazimda su fonksiyonlardan bahsedecegim :
- MONTHS_BETWEEN
- ADD_MONTHS
- NEXT_DAY ve LAST_DAY
- TO_DATE
- Tarih Degerleri uzerinde Round fonksiyonu
- Tarih Degerleri uzerinde Trunc fonksiyonu
- Current Date vs SYSDATE
MONTHS_BETWEEN fonksiyonu
Fonksiyonun isminden de anlasilacagi gibi iki tarih arasindaki ay bilgisini bize verir. MONTHS_BETWEEN(d1,d2)
select months_between ('18-JUN-2013', '18-MAY-2013') from dual; //1 select months_between ('18-JUN-2013', '20-MAY-2013') from dual; //0.93548387096774193548... select months_between ('18-JUN-2013', '20-MAY-2014') from dual; // -11.064516129...
Gordugunuz gibi en kucuk kusuratina kadar iki tarih arasinda kac ay oldugu bilgisini getirmektedir.
ADD_MONTHS fonksiyonu
Fonksiyonun genel formati add_months(d,m) dir, d ilgili tarihi m ise eklenecek ayin sayisini temsil etmektedir.
select add_months ('18-MAY-2013' ,1) from dual; //18-JUN-13 select add_months ('18-JUN-2013' ,15) from dual; //18-SEP-14 select add_months ('18-JUN-2013' ,-2) from dual; //18-SEP-14
NEXT_DAY ve LAST_DAY
Next_Day fonksiyonu genel formati : NEXT_DAY (d,DAY) burada d parametresi verdigimiz tarihi DAY parametresi ile verdigmiz tarihten sonra DAY degerinin hagi tarihe denk geldigi bilgisini dondurur.
select next_day ('18-MAY-2013' ,'tuesday') from dual; //21-MAY-13 select next_day ('18-MAY-2013' ,'Friday') from dual; //24-MAY-13 select next_day ('18-MAY-2013' ,'Saturday') from dual; //25-MAY-13
Gordugunuz gibi onumuzdeki tuesday, friday ve saturday gunlerinin hangi gune denk geldigi bilgisini getirmektedir.
Last_Day fonksiyonu da paremetre olarak aldigi tarih degerinin, son ay gunu bilgisini dondurmektedir.
select last_day('18-MAY-2013') from dual; //31-MAY-13 select last_day('1-JUN-2013') from dual; //30-JUN-13
TO_DATE fonksiyonu
Oracle 11 G de varsayilan tarih formai DD-MON_YY oldugunu belirtmistim. Fakat bununla birlikte bir cok tarih formati kullanimi soz konusudur. TO_DATE fonksiyonu bu formatlama islemine yaramaktadir. Oncelikle fortmatlama argumanlarini gorelim;
eleman
MONTH Ayin uzun ismi ,ornek APRIL
MON Ayin kisaltilmis ismi, APR
MM Ayin numerik simgesidir 04
RM Ayin roman rakami simgesidir iv
D Gunun numerik degeridir (haftalik wednesday=4 )
DD Gunun numerik degeridir (aylik , 18 )
DDD Gunun numerik degeridir (yillik DECEMBER 31 =365)
DAY Gun , wednesday
DY Gunun 3 harfe karsilik gelen kisaltmasidir. WED
YYYY Yil 2008
YYY , YY , Y Yil 009, 09, 9
YEAR Yilin kelime karsiligi TWO THOUSAND NINE
B.C A.C Milattan once millattan sonra.
select TO_DATE('JUNE 18, 1989' ,'MONTH DD, YYYY') from dual; select TO_DATE('JUN 18 89','MON DD YY') from dual; select TO_DATE('2008/06/10','yyyy/mm/dd') from dual; select TO_DATE('365, 2013','DDD,YYYY') from dual;
Cesitli kombinasyonlar ile formatlama ornekleri yapabilirsiniz.
Tarih Degerleri uzerinde Round fonksiyonu
Bir onceki yazimda numerik degerler uzerinde round fonksiyonundan bahsetmistim. Burada tarih degerleri uzerinde round islemini inceleyelim. Mantik olarak ayni yapidadir.
Ornekler uzerinde incelemeye devam edelim.
select round(TO_DATE('14-MAY-2013'),'DAY') from dual; //12-MAY-13 select round(TO_DATE('15-MAY-2013'),'DAY') from dual; //12-MAY-13 select round(TO_DATE('16-MAY-2013'),'DAY') from dual; //19-MAY-13 select round(TO_DATE('18-MAY-2013'),'DAY') from dual; //19-MAY-13 select round(TO_DATE('23-MAY-2013'),'DAY') from dual; //26-MAY-13
round fonksiyonu kullanabilmek icin once, degerleri TO_DATE fonksiyonu ile tarih degerine formatliyoruz.Burada Oracle’ a round islemini ikinci parametre olan DAY yani gune gore yap diyoruz. Burada 14, 15 Mayis gunu gune gore yuvarlandiginda , 12 Mayisa yuvarlanir cunku varsayilan formatta Pazar gunu haftanin ilk gunudur. Yuvarlama islemi gune gore yapildiginda haftanin ilk gunlerine yuvarlanir.
Persembe gunu dahil bir sonraki hafta basina yuvarlanir.
Carsamba gunu dahil onceki gunler bir onceki hafta basina yuvarlanir.
select round(TO_DATE('14-MAY-2013'),'MONTH') from dual; //01-MAY-13 select round(TO_DATE('15-MAY-2013'),'MONTH') from dual; //01-MAY-13 select round(TO_DATE('16-MAY-2013'),'MONTH') from dual; //01-JUN-13 select round(TO_DATE('18-MAY-2013'),'MONTH') from dual; //01-JUN-13 select round(TO_DATE('23-MAY-2013'),'MONTH') from dual; //01-JUN-13
Ayni mantikla eger MONTH parametresine gore yuvarlama islemi yapilirsa 15 gunden sonra bir sonraki aya yuvarlanir.
select round(TO_DATE('15-MAY-2013'),'YEAR') from dual; //01-JAN-13 select round(TO_DATE('18-JUN-2013'),'YEAR') from dual; //01-JAN-13 select round(TO_DATE('30-JUN-2013'),'YEAR') from dual; //01-JAN-13 select round(TO_DATE('1-JULY-2013'),'YEAR') from dual; //01-JAN-14 select round(TO_DATE('18-AUG-2013'),'YEAR') from dual; //01-JUN-14
Yila gore yuvarlama islemi yapildiginda 1 Temmuzdan sonraki gun icin bir sonraki yilin ocak ayina yuvarlanir.
Round fonksiyonunda parametre olarak olarak kullanabilecek baska degerler de vardir.
Tarih Degerleri uzerinde Trunc fonksiyonu
Trunc fonksiyonunu numerik degerler icin de kullanmistik. Ayni fonksiyonu tarih degerleri icin de kullanabiliriz. Trunc fonksiyonu yuvarlamak yerine kesip koparmak atmak gibi bir yaklasim sergiler.Tarih degerleri uzerinde bu sekilde bir yuvarlama islemi yapar diyebiliriz.
select trunc(TO_DATE('14-MAY-2013'),'DAY') from dual; //12-MAY-13 select trunc(TO_DATE('15-MAY-2013'),'DAY') from dual; //12-MAY-13 select trunc(TO_DATE('16-MAY-2013'),'DAY') from dual; //12-MAY-13 select trunc(TO_DATE('18-MAY-2013'),'DAY') from dual; //12-MAY-13 select trunc(TO_DATE('23-MAY-2013'),'DAY') from dual; //19-MAY-13
Gune gore trunc fonksiyonu yapildiginda , ilgili gunun icerisinde bulundugu haftanin ilk gunune tarihi yuvarlar.
select trunc(TO_DATE('14-MAY-2013'),'MONTH') from dual; //01-MAY-13 select trunc(TO_DATE('15-MAY-2013'),'MONTH') from dual; //01-MAY-13 select trunc(TO_DATE('16-MAY-2013'),'MONTH') from dual; //01-MAY-13 select trunc(TO_DATE('18-MAY-2013'),'MONTH') from dual; //01-MAY-13 select trunc(TO_DATE('23-MAY-2013'),'MONTH') from dual; //01-MAY-13
Aya gore trunc fonksiyonu yapildiginda , hangi gun olduguna bakilmaksizin gun bilgisini kesip atar ve ayin ilk gunu olarak sonuc doner.
select trunc(TO_DATE('15-MAY-2013'),'YEAR') from dual; //01-JAN-13 select trunc(TO_DATE('18-JUN-2013'),'YEAR') from dual; //01-JAN-13 select trunc(TO_DATE('30-JUN-2013'),'YEAR') from dual; //01-JAN-13 select trunc(TO_DATE('1-JULY-2013'),'YEAR') from dual; //01-JAN-13 select trunc(TO_DATE('18-AUG-2013'),'YEAR') from dual; //01-JUN-13
Yila gore trunc fonksiyonu yapildiginda, hangi gun ay olduguna bakmaksizin bu bilgileri onemsemez , kesip atar ve icerisinde bulunan yilin ilk gun sonucunu verir.
Trunc fonksiyonunun yuvarlama mantigi kesip atmaktan ibarettir.
Current Date vs SYSDATE
Son olarak current_date ve sysdate fonksiyonlarini inceleyelim. sysdate fonksiyonu veritabaninin oldugu makinenin (server) uzerinde calisan isletim sisteminden(operating system) tarih bilgisini alir. Fakat Current_Date fonksiyonu user session bilgisinden almaktadir, yani server makineye baska bir ulkeden baglanan makine current_date fonksiyonu ile kendi lokasyonundaki tarih bilgisini , sysdate ile de server makinenin bulundugu lokasyondaki tarih bilgisini alir.
select current_date, current_timestamp from dual; select sysdate,systimestamp from dual;
Yazima burada son veriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust
Leave a Reply