Add Months() Fonksiyonu
ADD_MONTHS Fonksiyonu ve Gün Ekleme
Merhaba arkadaşlar, Bu makalemde add_months() fonksiyonundaki bir takım incelikleri sizlerle paylaşacağım. Tarih bilgisi içeren önemli ve kritik raporlarınızda kesinlikle dikkatinizden kaçmaması gereken bir konu olduğunu düşünüyorum.
SQL tarih fonksiyonlarından biri de add_months fonksiyonudur. Bu fonksiyonun çeşitli kullanım şekilleri vardır. Fakat fonksiyonun temel mantığı; girilen bir tarihten itibaren, verilen ay sayısı kadar geriye veya ileriye gitmektir. Fonksiyonu analiz edersek ;
add_months(‘date’,number) şeklinde;
-date à girdiğimiz bir tarih,
-number à herhangi bir sayı (3,8,-4 gibi)
Şimdi fonksiyonu birkaç örnekle inceleyelim :
|
İfade |
Sonuç |
1 |
ADD_MONTHS('10-APR-2010', 2) |
10/06/2010 |
2 |
ADD_MONTHS(SYSDATE,2) |
07/02/2011 14:00:15 --(çalıştırdığım tarih üzere) |
3 |
ADD_MONTHS('15-JUL-1988',-2) |
15/05/1988 |
4 |
ADD_MONTHS('31-JAN-2010', 1) |
28/02/2010 |
5 |
ADD_MONTHS('30-JAN-2010', 1) |
28/02/2010 |
6 |
ADD_MONTHS('29-JAN-2010', 1) |
28/02/2010 |
7 |
ADD_MONTHS('28-JAN-2010', 1) |
28/02/2010 |
8 |
ADD_MONTHS('27-JAN-2010', 1) |
27/02/2010 |
9 |
ADD_MONTHS('30-JUN-1988',1) |
31/07/1988 |
10 |
TO_DATE('31-JAN-2010') + 30 |
02/03/2010 |
Yukarıdaki tablonun her satırındaki örnekleri dikkatle incelemekte fayda var.
Tablodaki örneklerden ilkinde ; 10 nisan 2010 tarihine , 2 ay ekliyoruz ve sonuç olarak 10 haziran tarihine gidiyoruz. Aynı şekilde 3. Örnekte 15 temmuzdan 2 ay geriye giderek 15 mayıs tarihine geliyoruz fakat dikkat etmemiz gereken önemli bir nokta var : O da 4 ve sonraki satırlardaki örnekler.
4. Örnekte, 31 ocak tarihine bir ay eklediğimizde 28 Şubata gidiyor. Yani bu fonksiyon mantık olarak seçilen tarih üzerine 30 gün eklemiyor. Takvim üzerinde direk belirtilen günden “x ay sonrasına” gidiyor. 4,5,6 ve 7. Satırlardaki ifadelerin aynı sonucu döndürmesinin sebebi budur. 30 ocaktan 1 ay sonra da 28 şubattır; 28 ocaktan 1 ay sonra da 28 şubattır. Burada dikkat edilmesi gereken, ay ekleme işlemini gün bazında değil takvim bazında yapmasıdır.
10. örneğe baktığımızda ise ekleme işlemi tamamen gün bazında yapılmaktadır. Yani verilen tarihin üstüne takvim üzerinden x sayıda gün eklenir ve o sonuç döndürülür.
PL-SQL (ORACLE) Fonksiyonları / Decode, NVL, NVL2
PL-SQL Fonksiyonlari : NVL
NVL(deger, deger_Null_ise_bu_deger_ile_degistir )
fonksiyonu eger deger ifadesinin degeri "null" ise, deger_Null_ise_bu_deger_ile_degistir ifadesi ile degistirir. Diger durumlarda deger i geri döndürecektir.
Fonksiyonun amaci, null olarak gelen degerleri, belirtilen deger ile degistirmektir. Bu islev ile ilgili alandaki tüm degerlerin "null" olmamasi garanti edilir.
Nerelerde tercih edilir ?
- Çogunlukla sayisal bir deger döndürmesi beklenen alanlardaki veriler eger "null" ise 0 ile degistirmek için kullanilir. Örnegin, müsterilerin yil yil gerçeklestirdigi tüm ödemeleri toplamak istiyorsunuz. Her bir müsterinin her yil için ödeme yapmamis olacagi olasi ve beklendik bir durumdur. Dolayisiyla müsteri ile dönem ve ödeme tablosunu "left join" ile bagladiginizda, bazi dönemlere ait ödeme kayitlariniz "null" olarak gelecektir. Aritmetik isleme dahil edebilmek için bu alanlari 0 ile degistirmeniz gerekmektedir.
- String degerleri birlestimek istediginizde, "null" kontrolu yapmaniz gerekmektedir. Çünkü birlestireceginiz alanlar (metinler) içinde eger bir tane bile "null" degere sahip alan varsa, tüm ifadeniz "null" olacaktir. Bu durumda "null" olan degeri '' (bos karakter) ile degistirmeniz gerekmektedir. Örnegin, il , ilçe ve semt taniminin bulundugu tablonuzdaki bu alanlari birlestirerek müsterinin adresini tek satir halinde elde etmek istiyorsaniz, bu alanlardan herhangi birisinin girilmemis olma ihtimalini (null olma ihtimali) göz ardi etmemelisiniz aksi taktirde sadece semt bilgisi girilmemis kayitlar için bile tüm adres degerini "null" olarak elde edersiniz.
select NVL(donem_toplami,0) as toplam ...
select NVL(metin1,'') || NVL(metin2,'') || ... || NVL(metinN,'') as olusturulanMetin ...
PL-SQL Fonksiyonlari : NVL2
NVL2( deger, deger_Null_degilse_bu_deger_ile_degistir, deger_Null_ise_bu_deger_ile_degistir)
fonksiyonu deger i eger deger NULL degilse 2. parametre ile NULL is 3.parametre ile degistirir.
Özellestirilmis bir IF-ELSE yazimidir. Eger alan "null" degil ise deger_Null_degilse_bu_deger_ile_degistir degeri ile , "null" ise deger_Null_ise_bu_deger_ile_degistir degeri ile degistirir.
Nerede tercih edilir ?
- Bir alanin "null" olup olmama durumuna göre kullaniciya anlamli bir mesaj vermek istediginizde kullanabilirsiniz. "null" ise YOK , degil ise VAR yazmak için kullanabilirsiniz.
PL-SQL Fonksiyonlari : DECODE
Decode( ifade, aranan_deger1, aranan_deger1e_esit_ise_bu_deger_ile_degistir,aranan_deger2 ,aranan_deger2e_esit_ise_bu_deger_ile_degistir, [aranan_degerN, aranan_degerNe_esit_ise_bu_deger_ile_degistir]... [hicbiri_ile_eslesmedi_ise_bu_deger_ile_degistir] )
fonksiyonu ifade içersinde aranan_deger1 ... aranan_degerN degerlerini arar ve ifade hangi aranan_deger e karsilik geliyor ise aranan_degere_esit_ise_bu_deger_ile_degistir degerini döndürür.
Fonksiyonu IF-THEN-ELSE-END kullanimina karsilik gelir. Pl-Sql özelinde CASE-WHEN-ELSE-ENDCASE-WHEN kalibinda istediginiz herhangi bir kosulu kullanabilirken, Decode esitlik durumlari için elverislidir. kalibina karsilik gelir. Bu kalibin esitlik durumlari için özellestirilmis halidir. Yani
Nerelerde tercih edilir ?
- NVL fonksiyonlari sadece "null" ile kiyaslama yaparken, Decode fonksiyonu herhangi bir deger ileNVL fonksiyonlarini kapsar. Onlarin kullanildigi heryerde kullanilabilir. kiyasma yapabilme imkani tanir. Dolayisyla
- Belirli kodlara karsilik, bazi tanimlar yazilmak isteniyorsa kullanilir. Örnegin, Decode(IL_KODU,34, 'ISTANBUL', 10, 'BALIKESIR' , 10.5 , 'BANDIRMA' , 35, 'IZMIR' , 35.5 , 'KARSIYAKA', 'TÜRKIYE') de oldugu gibi dönen il koduna göre ISTANBUL,BALIKESIR, BANDIRMA ... yada hiç eslesen olmamasi durumda TÜRKIYE döndürmek için kullanilabilir.
- Referans tablolari olmayan degerleri anlamlandirmak için kullanilabilir. DECODE(Alan,1,'Evet', 0, 'Hayir','Belki') seklinde tanimlarsak, Alan'dan dönen deger 1 ise Evet , 0 ise Hayir , 1 veya 0 dan farkli bir deger döner ise Belki degerini geri döndürecektir.
Alintidir --> http://dervisali.blogspot.com/2008/06/oracle-functions.html
Sql Grup Fonksiyonları
Bir Alanın Toplamını Hesaplama (SUM)
SUM(kolon_adı) fonksiyonu, bir alandaki verilerin toplamını hesaplar. Kolondaki verilerin hepsi sayısal veri tipinde(data type) (tam sayı(integer), ondalıklı sayı(decimal),devirli sayı(floating point), para(money)) olmalıdırlar.
Bir Kolonun Averajını Hesaplama (AVG)
AVG(kolon_adı) fonksiyonu, bir kolondaki verilerin averajı(aritmetik ortalaması)nı hesaplar. Kolondaki verilerin hepsi aynı sayısal (numeric) veri tipinde (data type) (tam sayı(integer), ondalıklı sayı(decimal), devirli sayı(floating point),para(money)) olmalıdırlar.
En büyük ve En küçük Değerlerin Bulunması (MIN ve MAX)
MIN(kolon_adı) ve MAX(kolon_adı) fonksiyonları sırasıyla, bir kolondaki en küçük ve en büyük değeri bulurlar. Kolondaki veriler sayısal (numeric), zaman (date/time), karakter (string) veri tipinde olabilirler. MIN ve MAX fonksiyonlarının sonuçları da kendilerini oluşturan kolondaki verilerle aynı veri tipindedirler.
Verileri Sayma (COUNT)
COUNT(kolon_adı) fonksiyonu, karşılaştırma değerine uyan kayıtların sayısını verir. Sonuç tam sayıdır. Alanı oluşturan veriler arasında boş (NULL) değerler varsa bunlar sayılmazlar.
CREATE TABLE satis ( satis_no varchar2(10), tarih date(15), tutar number(15), );
|
Satis_no Tarih Tutar |
SELECT SUM(tutar) “Satış Toplamı” FROM satis
|
Satış Toplamı |
SELECT MAX(tutar) “En büyük Satış” FROM satis
|
En büyük Satış |
SELECT MIN(tutar) “En küçük Satış” FROM satis
|
En küçük Satış |
SELECT AVG(tutar) “Ortalama Satış” FROM satis
|
Ortalama Satış |
SELECT count(*) “Satış Sayısı” FROM satis
|
Satış Sayısı |
SELECT tarih,sum(tutar) “Toplam” ,count(*) “Adet” FROM satis
|
Tarih Toplam Adet |