Yapmakta oldugum bir proje icin Tarih sorgusu ariyorum

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
raxs
Üye
Mesajlar: 13
Kayıt: 02 Oca 2008 10:35

Yapmakta oldugum bir proje icin Tarih sorgusu ariyorum

Mesaj gönderen raxs »

Merhabalar bir projem var ve bu projede bana kaydi tutulan dogum tarihlerinin
0-6ay
6-12 ay
1-2 yas
2-3 yas
3 yas ustu
olacak sekilde kac katdin oldugu sorgusu istenmekte bunu firebird de nasil sorgulattiririm fikri olan arkadaslara simdiden tesekkur ederim.
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Mesaj gönderen SAHAN33 »

date fonksiyonlarında date-150 gibi istenilen tarihe dönmek mümkün. sen her yaş grubu için bir başlangıç ve bir bitiş tarihi oluşturacaksın.

Tarih1 = Date-150 ( 0-6 aylıklar)
Tarih2 = Tarih1-150 (6-12 aylıklar)
Tarih3 = Tarih2-365 (1-2 yaşlar)
Tarih4 = Tarih3-365 (2-3 yaşlar)
Tarih5 = Tarih4-360 (3 yaş ve üstü)

sonra sorgu içinde iki tarih aralığında WHERE TARIH IN[TARIH1,TARIH2] gibi istenilen iki tarih aralığındaki kayıtları Count(*) ile alabilirsin..

Kolay gelsin..
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

Bir UDF hazırladım. Kodlar ve kullanımı aşağıda. Temel mantık olarak, verilen 2 tarih arasındaki ay saısını buluyor ve senin gruplarına göre her gruba bir değer döndürüyor.

DelphiTurkiye.dpr kodu

Kod: Tümünü seç

library DelphiTurkiye;

uses
  SysUtils,
  Classes,
  untTarih in 'untTarih.pas';

{$R *.res}

exports
  YasGrubu;

begin
end.
untTarih.pas kodu

Kod: Tümünü seç

unit untTarih;

interface

uses SysUtils, DateUtils, Windows;

const
  IBASE_DLL = 'gds32.dll';

type
  Long                 = LongInt; // 32 bit signed
  ULong                = DWord;   // 32 bit unsigned

  TM = record
    tm_sec : integer;   // Saniye
    tm_min : integer;   // Dakika
    tm_hour : integer;  // Saat (0-23)
    tm_mday : integer;  // aydaki gün (1-31)
    tm_mon : integer;   // Ay (0-11)
    tm_year : integer;  // Yil (takvim yilindan 1900 eksiği)
    tm_wday : integer;  // Haftanın günü (0-6) Pazar = 0)
    tm_yday : integer;  // Yilin günü (0-365)
    tm_isdst : integer; // 0 if daylight savings time is not in effect)
  end;
  PTM             = ^TM;

  ISC_TIMESTAMP = record
    timestamp_date : Long;
    timestamp_time : ULong;
  end;
  PISC_TIMESTAMP = ^ISC_TIMESTAMP;

function YasGrubu(var IlkTarih, IkinciTarih : Long):integer;stdcall;

implementation

procedure isc_encode_timestamp  (tm_date  : PTM; ib_date  : PISC_TIMESTAMP);stdcall; external IBASE_DLL;
procedure isc_decode_timestamp  (ib_date: PISC_TIMESTAMP;  tm_date: PTM);stdcall; external IBASE_DLL;
procedure isc_decode_sql_date   (var ib_date: Long; tm_date: PTM); stdcall; external IBASE_DLL;
procedure isc_encode_sql_date   (tm_date: PTM; var ib_date: Long);stdcall; external IBASE_DLL;
procedure isc_decode_sql_time   (var ib_date: ULong; tm_date: PTM);stdcall; external IBASE_DLL;
procedure isc_encode_sql_time   (tm_date: PTM; var ib_date: ULong);stdcall; external IBASE_DLL

function YasGrubu(var IlkTarih, IkinciTarih : Long):integer;
 var
   tm_ilk, tm_ikinci : TM;
   TempIlkTarih, TempIkinciTarih : TDateTime;
   i : integer;
begin
  Result := -1;

  isc_decode_sql_date(IlkTarih, @tm_ilk);
  isc_decode_sql_date(IkinciTarih, @tm_ikinci);

  TempIlkTarih := EncodeDate(tm_ilk.tm_year + 1900, tm_ilk.tm_mon+1, tm_ilk.tm_mday);
  TempIkinciTarih := EncodeDate(tm_ikinci.tm_year + 1900, tm_ikinci.tm_mon+1, tm_ikinci.tm_mday);

  i := MonthsBetween(TempIlkTarih, TempIkinciTarih);
  case i of
    0..6     : Result := 1;
    7..12    : Result := 2;
    13..24   : Result := 3;
    25..36   : Result := 4;
    37..3000 : Result := 5;
  else
    Result := -1;
  end;
end;

end.
Kullanımı da şu şekilde, dogum_tarihi ve tablo_adi kısımlarını yapına göre değiştirirsin :

Kod: Tümünü seç

select YasGrubu(current_date, dogum_tarihi) as grup, count(*)
from tablo_adi
group by YasGrubu(current_date, dogum_tarihi)
Sen yapına göre ufak tefek değişiklikler yaparsın.

Kolay gelsin.
Kullanıcı avatarı
raxs
Üye
Mesajlar: 13
Kayıt: 02 Oca 2008 10:35

Mesaj gönderen raxs »

cok tesekkur ederim sagolun
Kullanıcı avatarı
raxs
Üye
Mesajlar: 13
Kayıt: 02 Oca 2008 10:35

Mesaj gönderen raxs »

mussimsek hocam
kodu select ettigimde bu tur bir hata aliyorum.nedeni ne olabilir acaba
conversion error from string "2008-02-17"
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Doğum tarihlerini tuttuğun alanın tipi nedir? String ise cast ile date tipine çevirmen lazım.

cast (dogum_tarihi as date)

gibi.

Kolay gelsin.
Kullanıcı avatarı
raxs
Üye
Mesajlar: 13
Kayıt: 02 Oca 2008 10:35

Mesaj gönderen raxs »

Dogum Tarihi date yanliz sunu soracam

DECLARE EXTERNAL FUNCTION YasGrubu
integer, integer
RETURNS integer BY VALUE
ENTRY_POINT 'YasGrubu' MODULE_NAME 'TarihSorgu';
yasgrubu integer olacak degilmi
Kullanıcı avatarı
raxs
Üye
Mesajlar: 13
Kayıt: 02 Oca 2008 10:35

Mesaj gönderen raxs »

hata bende alanlari integer olarak tanimliyormusum date olacak cok tesekkur ederim destekleriniz icin inanin bu kod ilac oldu desem yeridir. hayirli aksamlar.
Cevapla