Merhaba,
Diğer arkadaşlarımızın söylediği gibi tarihi ayrı bir alan olarak kullanmanız gerekir. Yok eğer "benim böyle bir alan oluşturmaya imkanım yok daha önce böyle girilmiş ve benim onları almam gerekiyor " diyorsanız. Aşağıdaki iskeleti biraz daha geliştirerek kendinize uygun hale getirebilirsiniz.
!!! Bu programcık __.__._____ şeklinde girilenleri arıyor. Yani ilk noktayı buluyor. Sonra bulduğu konumdan 2 konum sonrasına bakıyor o da '.' ise bulmuş oluyor. Ama eğer
bu kayıt.25.10.2006 tarihinde tahsil edildi.
şeklinde yazılmışsa hatalı olacaktır. O yüzden biraz da geliştirmeniz lazım diyorum. Ayrıca 29.02.2006 şeklinde bir tarih yazmışsa da 2006 da 29 olmadığından hata verecektir. Bu tür kontrolleri yapmanız lazım.
!!!! Bu programcıkta rfunc udf leri kullanılmıştır. Örneğin strpos ve substr yi kullanmak için onları yüklemiş olmanız lazım.
Programcık dökümü aşağıdadır.
Kod: Tümünü seç
CREATE PROCEDURE TARIH_AL (
BASLANGIC DATE,
BITIS DATE)
RETURNS (
ADSOY VARCHAR(10),
DOGTAR DATE,
ACIKL VARCHAR(50),
ACIKLAMA_TAR DATE)
AS
DECLARE VARIABLE CIKIS CHAR(1);
DECLARE VARIABLE KONUM INTEGER;
DECLARE VARIABLE SONUC VARCHAR(10);
begin
for
select adi_soyadi,dogum_tar,aciklama
from dog_tarihi where aciklama like '%__.__.____%'
into :adsoy, :dogtar,:acikl
do begin
CIKIS='H' ;
while (CIKIS='H')
do begin
KONUM=strpos('.',:acikl);
if (SUBSTR(:acikl,KONUM,1)='.') then
sonuc=substr(:acikl , KONUM-2,10);
CIKIS='E' ;
aciklama_tar=cast(sonuc as date);
if (aciklama_tar>=baslangic and aciklama_tar<=bitis) then
suspend;
end
end
end
Programcığı denemek için aşağıdaki tablo oluşturulmuştur.
Kod: Tümünü seç
CREATE TABLE DOG_TARIHI (
KNO INTEGER,
ADI_SOYADI VARCHAR(50),
DOGUM_TAR DATE,
ACIKLAMA VARCHAR(50) COLLATE PXW_TURK
);
Tabloya aşağıdaki örnek veriler girilmiştir.
Kod: Tümünü seç
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (1, 'KADRI ', '1991-02-14', 'bu para 12.02.2006 da tahsil edildi. ');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (2, 'AHMET', '1991-02-15', 'bu para 14.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (3, 'MEHMET', '1991-03-01', 'bu para 18.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (4, 'SAIT', '1991-03-08', 'bu para 23.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (5, 'SELAMI', '1991-03-16', 'bu para 25.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (6, 'SADULLAH', '1991-04-17', 'bu para 12.02.2007 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (7, 'SADIK', '1991-05-25', 'bu para 15.03.2007 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (8, 'KERİM', '1991-05-23', 'bu para 19.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (9, 'NURULLAH', '1991-05-21', 'bu para 11.02.2006 da tahsil edildi.');
COMMIT WORK;
Bu şekilde hazırlandıktan sonra
Kod: Tümünü seç
select * from tarih_al('01.02.2006','28.02.2006')
gibi komut girilerek sonuç alınabilir. Ben ibexpertte denedim. Normal çıkıyordu.
Birinci tarih başlangıç, ikinci tarih bitiş tarihi oluyor.
Kolay gelsin.