Firebird : DateDiff (Excel ETARİHLİ fonk. birebir kopyası)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Firebird : DateDiff (Excel ETARİHLİ fonk. birebir kopyası)

Mesaj gönderen anemos »

Firebird' de "DateDiff" fonksiyonunun çalışma mantığı biraz farklı olduğundan istemediğimiz farklar döner.

Kıdem tazminatı vs. gibi önemli konularda istediğimiz sonuçları görebilmek için aşağıdaki proseduru kullanabilirsiniz...

Şimdiye kadar yaptığım testlerde hatalı sonuç çıkmadı. Sonuçlar Exceldeki "ETARİHLİ" fonksiyonuyla eştir.

y : iki tarih arasındaki Toplam Yılı hesaplar
m : iki tarih arasında Toplam Ayı hesaplar
d : iki tarih arasında Toplam Günü hesaplar
md : iki tarih arasındaki Günü hesaplar, Ay ve Yıl yok sayılır
yd : iki tarih arasındaki Günü hesaplar, Yıl yok sayılır
ym : iki tarih arasındaki Ayı hesaplar, Gün ve Yıl yok sayılır

Örnek kullanım 1:

Kod: Tümünü seç

SELECT
 (SELECT SONUC FROM XLDATEDIFF ('y', '20.08.1978', '22.02.2012')) || ' Yıl ' ||
 (SELECT SONUC FROM XLDATEDIFF ('ym', '20.08.1978', '22.02.2012')) || ' Ay ' ||
 (SELECT SONUC FROM XLDATEDIFF ('md', '20.08.1978', '22.02.2012')) || ' Gün' AS "Yaşam Süreniz"
 /* Sonuç : 33 Yıl 6 Ay 2 Gün */
FROM RDB$DATABASE
Örnek kullanım 2:

Kod: Tümünü seç

SELECT
 (SELECT SONUC FROM XLDATEDIFF ('y', '20.08.1978', '22.02.2012')) AS "Yıl Farkı (y)",   --Toplam Yıl
 (SELECT SONUC FROM XLDATEDIFF ('m', '20.08.1978', '22.02.2012')) AS "Ay Farkı (m)",    --Toplam Ay
 (SELECT SONUC FROM XLDATEDIFF ('d', '20.08.1978', '22.02.2012')) AS "Gün Farkı (d)",   --Toplam Gün
 (SELECT SONUC FROM XLDATEDIFF ('md', '20.08.1978', '22.02.2012')) AS "Gün Farkı (md)", --Ay ve Yıl yok sayılır.
 (SELECT SONUC FROM XLDATEDIFF ('yd', '20.08.1978', '22.02.2012')) AS "Gün Farkı (yd)", --Yalnız Yıl yok sayılır.
 (SELECT SONUC FROM XLDATEDIFF ('ym', '20.08.1978', '22.02.2012')) AS "Ay Farkı (ym)"   --Gün ve Yıl yok sayılır.
FROM RDB$DATABASE
Prosedur :

Kod: Tümünü seç

create or alter procedure xldatediff (
    interval char(2),
    kucuk_tarih date,
    buyuk_tarih date)
returns (sonuc bigint)
/*
y  : iki tarih arasındaki Toplam Yılı hesaplar
m  : iki tarih arasında Toplam Ayı hesaplar
d  : iki tarih arasında Toplam Günü hesaplar
md : iki tarih arasındaki Günü hesaplar, Ay ve Yıl yok sayılır
yd : iki tarih arasındaki Günü hesaplar, Yıl yok sayılır
ym : iki tarih arasındaki Ayı hesaplar, Gün ve Yıl yok sayılır
*/
as
declare variable fyil smallint = 0;
declare variable fay  smallint = 0;
begin
    fay = iif(extract(day from kucuk_tarih) > extract(day from buyuk_tarih), -1, 0);              
    fyil = iif((datediff(month, kucuk_tarih, buyuk_tarih) + fay) - 
                datediff(year, kucuk_tarih, buyuk_tarih) * 12 < 0, -1, 0);    
                               
    if (lower(interval) = 'y') then
        begin            
            sonuc = datediff(year, kucuk_tarih, buyuk_tarih) + fyil;
            suspend;
            exit;
        end    
    if (lower(interval) = 'm') then
        begin                
            sonuc = datediff(month, kucuk_tarih, buyuk_tarih) + fay;
            suspend;
            exit;
        end    
    if (lower(interval) = 'd') then
        begin                
            sonuc = datediff(day, kucuk_tarih, buyuk_tarih);
            suspend;
            exit;
        end    
    if (lower(interval) = 'yd') then
        begin               
            sonuc = datediff(day, dateadd(year, 
                             datediff(year, kucuk_tarih, buyuk_tarih) + fyil, 
                             kucuk_tarih), buyuk_tarih);                
            suspend;
            exit;
        end    
    if (lower(interval) = 'md') then
        begin               
            sonuc = datediff(day, dateadd(month, 
                             datediff(month, kucuk_tarih, buyuk_tarih) + fay, 
                             kucuk_tarih), buyuk_tarih);                
            suspend;
            exit;
        end    
    if (lower(interval) = 'ym') then
        begin           
            sonuc = mod(datediff(month, kucuk_tarih, buyuk_tarih) + fay, 12);
            suspend;
            exit;
        end        
end
Cevapla