SQL tarih sorgulama hatası (BETWEEN)

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
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

SQL tarih sorgulama hatası (BETWEEN)

Mesaj gönderen csyasar »

arkadaşlar;

...
var
tarih:TDate;
begin
tarih:=NOW+StrtoInt(Edit1.text);
Query1.close;
Query1.SQL.clear;
Query1.SQL.add('select * from co.db');
Query1.SQL.add('Where ODEMETARIHI BETWEEN ' +#39+DateTostr(now)+#39 + 'AND' + #39 + DatetoStr(tarih) + #39);
Query1.open;

bu sorgu çalışıyor! yalnız;
sql sorgusunda edit1.text'in değerine mesela 10 yazınca yanlış listeleme yapıyor.

doğru değerleri getirmesi için tarih değişkenini:
tarih:=NOW+(Edit1.Text)+31 şeklinde değiştirmeniz yani sonuna +31 eklemeniz gerekiyor. bu şekildeki değişiklikleri yapınca program düzenli olarak çalışıyor.

Sorum şu:
Bu sorgu sorun çıkarmadan düzenli olarak çalışır mı?
yoksa ben mi yanlışlık yapıyorum?
bana göre kodlarda bi yanlışlık yok. sadece tarih değişkenini neden belirttiğim gibi değiştirmem gerekti onu anlamadım.

Kolay gelsin!
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

yapmak istedigin bugunun tarihi ile 10 yada degisken bir gun arası sorgulama yapmak ise basit toplama yerine IncDay gibi fonksiyonları kullan
bende d5 oldugundan bu fonk yok ama muhtemelen d6 yada d7 de var

ornek kullanım

Kod: Tümünü seç

Example code : A simple example of increment and decrement 
// Full Unit code.
// -----------------------------------------------------------
// You must store this code in a unit called Unit1 with a form
// called Form1 that has an OnCreate event called FormCreate.
 
unit Unit1;
 
interface
 
uses
  DateUtils,   // Unit containing the IncDay command
  SysUtils,
  Forms, Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
{$R *.dfm} // Include form definitions
 
procedure TForm1.FormCreate(Sender: TObject);
var
  myDate : TDateTime;
begin
  // Set up our date just before the end of the year 2000
  myDate := EncodeDate(2000, 12, 30);
  ShowMessage('myDate = '+DateToStr(myDate));

  // Add 10 days to this date
  myDate := IncDay(myDate, 10);
  ShowMessage('myDate + 10 days = '+DateToStr(myDate));

  // Subtract 12 days from this date
  myDate := IncDay(myDate, -12);
  ShowMessage('myDate - 12 days = '+DateToStr(myDate));
end;
 
end.  
/////////////////////////////////////////////////////////
sonuc:
   myDate = 30/12/2000
   myDate + 10 days = 09/01/2001
   myDate - 12 days = 29/12/2000
   

ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

@gkimirti dediği işini görür. Merakımdan soruyorum, Neden Edit Kullanıyorsun, DateTimePicker değil ?

...
var
begin
tarih:=NOW+StrtoInt(Edit1.text);
Query1.close;
Query1.SQL.clear;
Query1.SQL.add('select * from co.db');
Query1.SQL.add('Where ODEMETARIHI BETWEEN ' +#39+DateTostr(now)+#39 + 'AND' + #39 + DatetoStr(tarih) + #39);
Query1.open;
..

yerine
SQL runtimeda değişmiycekse yani parametrelerin dışında 1 kez yaman yeterli

Kod: Tümünü seç

...
//FormShow Event ı olabilir
Query1.close; 
Query1.SQL.clear; 
Query1.SQL.add('select * from co.db'); 
Query1.SQL.add('Where ODEMETARIHI BETWEEN :_IlkTarih AND :_SonTarih);
........
Kullanım içinde

...

Kod: Tümünü seç

Query1.Close;
Query1.Prepare;
Query1.ParamByName('_IlkTarih').AsDateTime := TDate(DateTimePicker1.Date);
Query1.ParamByName('_SonTarih').AsDateTime := TDate(DateTimePicker2.Date);
Query1.Open;
gibi bir kod kullanırsan sanırım daha iyi olur.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla