Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi SQL - Chyba pri vyhodnocovaní podmienky alebo zlé zadanie? (where)

V Delphi mám tabuľku, z ktorej potrebujem vydolovať záznamy, ktoré sú v určitom časovom rozmedzí. Časy sú definované takto:

Time - dátum a čas od (vrátane)
TempTime - dátum a čas do (nevrátane)

Po zadaní SQL príkazu do komponenty a jeho selektovaní sa mi zobrazia všetky záznamy vyhovujúce len dátumom. Porovnanie času pri rovnakom dátume je ignorované. Stratil som na tom vyše hodiny a začínam mať pocit, že sa jedná o chybu Delphi. Prioritu operátorov som vylúčil, pretože som tam nasypal zátvoriek, až to zdravé nie je. Funkčný program, ktorý som len "vycucol" z originálu je tu na stiahnutie aj so zdrojovým kódom. Ak vás môžem poprosiť, pozrite sa na to niekto, ponáhľa mi to. Keď prídem z roboty o 22:20, tak sa pozriem, či ste niekto zistili problém.

http://data2.edisk.cz/stahni/84143/SQL.ZIP_409.05kB .html

V zdrojovom kóde sú zapoznámkované dva SQL príkazy. Jeden zobrazí všetko, druhý len vybrané záznamy v určenom časovom intervale. Ale keďže to nefunguje ako má, tak zobrazí dva záznamy. Správne by nemal zobraziť nič.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Už čakám na to, čo mi povie Rce, pretože ten sa s tým musel stretnúť, ak je to chyba v Delphi. Ak ni…
msx. 17.04.2007 22:32
msx.
Díky za uznání, ale chyba v Delphi (rep. v BDE) není - teda tahle chyba, jiné tam pochopitelně jsou…
Rce 17.04.2007 23:27
Rce
Query.SQL.Text := 'select....'; Nedávno som vyčítal z helpu, že je to len na čítanie, takže ostanem…
msx. 30.04.2007 23:19
msx.
Pokud jsi tohle vyčetl, tak jsi to vyčetl špatně. Je to to samé jako Memo.Lines.Text := 'nejaký řetě… poslední
Jan Fiala 01.05.2007 10:34
Jan Fiala

Díky za uznání, ale chyba v Delphi (rep. v BDE) není - teda tahle chyba, jiné tam pochopitelně jsou :)).
1) Máš nevhodně navrženou tabulku, je lépe mít datum a čas v jednom poli typu DateTime než extra datum a extra čas - pak by se s výhodou použil predikát BETWEEN.
2) Když už to máš, jak to máš, tak je třeba si uvědomit, že čas je podmnožinou datumu. Podmínka by měla vypadat asi takto:

where ((Datum > :Datum_od) or ((Datum = :Datum_od) and (Cas >= :Cas_od)))   and   ((Datum < :Datum_do) or ((Datum = :Datum_do) and (Cas <= :Cas_do)))'

[původně jsi měl ...(Datum >= :Datum_od)... a ...(Datum <= :Datum_do)... Tak jak jsi to měl, byla podmínka splněna už podle data a čas se nikdy nemohl uplatnit]

3) Nacpat datum a čas v Delpháckém tvaru je jediné správné přes parametry, systém si to přešrotí sám a dobře. Jde to taky cpát textově, ale pak je nutno znásilnit funkce aby převedly datum a čas do amerického formátu yyyy/mm/dd.
4) Necpal bych to textově do Query.SQL [0] ale přímo napsal v editoru do vlastnosti SQL. Když už to cpát programem, tak: Query.SQL.Text := 'select....';

Zpět do poradny Odpovědět na původní otázku Nahoru