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č.

Předmět Autor Datum
Som len síce "hobby programátor" ale skús to takto: procedure TForm1.Button1Click(Sender: TObject);…
pme 17.04.2007 18:33
pme
to by ti neslo, napr. ak by bolo 1.1.2007 20:00 - 10.1.2007 0:00, a zadal by si mu na testovanie nap…
MM.. 17.04.2007 19:02
MM..
nepostrehl jsem jakou db pouzivas, ale obecne je "problem" u porovnavani datumu a casu. Jelikoz db s…
Adam T 17.04.2007 18:45
Adam T
1. Akym sposobom je ulozeny datum a cas v databaze? Akym sposobom pracuje tvoj SQL server s datumom…
MM.. 17.04.2007 18:58
MM..
1. Datum a čas v DB je uložený ako typ Date resp. Time. Databáza je vytvorená SQL príkazom z prostre…
msx. 17.04.2007 22:31
msx.
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.
Nejde mi to, zadávam to asi v nesprávnom formáte. Práve preto som použil ParamByName, aby som sa tom…
msx. 17.04.2007 22:42
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
1. Na vytvorenie tabuľky som použil stránku datatypes.php. Tú mi našiel Google. Nechcel som toľko ot…
msx. 18.04.2007 00:10
msx.
(...)to je pracovné TQuery a to v priebehu programu neustále mení obsah (...) Tak do toho formu nal…
Rce 18.04.2007 01:02
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.
Co tak pouzit Query.SQL.Add - je to TStringList... SQL[0]:?::?::?:
Intex 01.05.2007 10:26
Intex
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

Som len síce "hobby programátor" ale skús to takto:

procedure TForm1.Button1Click(Sender: TObject);
var
  DateFrom, DateTo,
  TimeFrom, TimeTo: String;
begin
   DateFrom := '04/17/2007';
   TimeFrom := '11:00:00';
   DateTo := '04/19/2007';
   TimeTo := '11:00:00';
   Query.Close;
   Query.SQL.Clear;
   Query.SQL.Text := 'select * from Praca_objednavka' +
         ' where ((Datum >= "'+DateFrom+'") and (Cas >= "'+ TimeFrom+'"))'+
         ' or ((Datum < "'+DateTo+'") and (Cas < "'+ TimeTo+'"))';
   Query.Active := True;
end;

Trochu krkolomné :-[, ale nechce sa mi to prerábať... Lepšie riešenie sa nájde :-D
Inak, asi by som použil typ Timestamp namiesto Date + Time :i:

to by ti neslo, napr. ak by bolo 1.1.2007 20:00 - 10.1.2007 0:00, a zadal by si mu na testovanie napr. 2.1.2007 1:00 tak by tie podmienky neplatili ale 2.1.2007 je medzi 1.1.2007 a 10.1.2007

... ale to pouzitie retazcov vkladanych to SQL prikazu treba skusit, resp. zavisi od toho ako ma ten datum/cas ulozeny v databaze.

nepostrehl jsem jakou db pouzivas, ale obecne je "problem" u porovnavani datumu a casu. Jelikoz db server tezko pozna jestlis mu to dal ve formatu DDMMYY nebo libovolnou kombinaci a to same plati o hodinach. Nevim jak (pravdepodobne) mysql, ale treba v oraclu mu radeji rekni jaky string mu soupes (fce to_date - skryva se v ni i formatovani hodin).

1. Akym sposobom je ulozeny datum a cas v databaze? Akym sposobom pracuje tvoj SQL server s datumom a casom (ak je to v databaze ulozene ako specialny typ - datum, cas)?
2. skusil by som vyhodit odtial to ParamByName, predpripravit si datup a cas ako stringy a skombinovat ich priamo do toho prikazu aby bolo jasne ako vyzera ten SQL prikaz (v textovej forme)

1. Datum a čas v DB je uložený ako typ Date resp. Time. Databáza je vytvorená SQL príkazom z prostredia Delphi, čiže priamo z bežiacej aplikácie. Využíva sa teda štandardný SQL typ Date a Time.

2. Môžem vyskúšať, ale vyhol som sa tomu práve kvôli tomu, že som nevedel, v akom formáte to Delphi chce. Okrem toho bál som sa, že bude prehodený mesiac a deň a dám to zle, príp., že to bude závislé podľa národného nastavenia. Ale toto asi nie, lebo reálne čísla sú nezávislé.

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....';

1. Na vytvorenie tabuľky som použil stránku datatypes.php. Tú mi našiel Google. Nechcel som toľko otravovať na poradni, keďže to som si ozaj vedel nájsť sám. DateTime tam žiaľ nie je. Mne osobne to v programe vyhovuje viac (DateTime), ale už to meniť nebudem.

2. Toľko kriku za 2 =. Tak toto som ozaj dokonale prehliadol. Ďakujem a ani sa nečudujem, že mi to nešlo. Akurát koniec musí byť tento, (Cas < :Cas_do))), inak by to bolo vrátane.

3. Mne stačí, čo som si užil za reálne číslo, ktoré som nakoniec aj tak vyhodil, lebo v programe to nevyhovovalo.

4. Napísať priamo vlastnosti to nemôžem, lebo to je pracovné TQuery a to v priebehu programu neustále mení obsah, ale o vlastnosti SQL.Text som nevedel.:i:
________
Vyriešené

(...)to je pracovné TQuery a to v priebehu programu neustále mení obsah (...)

Tak do toho formu naláduj klidně hojnost TQuery. Nebo tam nacpi TDatabase a ta má přímo metodu Execute, která provede znakový SQL příkaz.

Na vytvorenie tabuľky som použil stránku...

Ta stránka není nejvhodnější pro SQL. Zrovna o Paradoxu (BDE) tam není ani muk. Doporučuji "C:\Program Files\Common Files\Borland Shared\Bde\bde32.hlp", který popisuje vnitřek BDE včetně příkladů v Delphi a "C:\Program Files\Common Files\Borland Shared\Bde\localsql.hlp" popisující příkazy SQL pro BDE. Též jsou dobré stránky o BDE (sice z pozice C++ ale pro Delphi též použitelné) hl.html .

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