Življenje

Oblikovanje časovnih vrednosti datuma za dostop do SQL v Delphiju

Oblikovanje časovnih vrednosti datuma za dostop do SQL v Delphiju

Vedno dobite grozno "Objekt parametra ni pravilno določen. Podani so bili neskladni ali nepopolni podatki"Napaka JET? Tukaj je, kako odpraviti situacijo.

Ko morate ustvariti poizvedbo SQL proti bazi podatkov Access, kjer je uporabljena vrednost datuma (ali datuma), morate poskrbeti za pravilno oblikovanje.

Na primer v poizvedbi SQL: "SELECT * FROM TBL WHERE DateField = '10 / 12/2008" "želite dobiti vse zapise iz tabele z imenom TBL, kjer je splošno datumsko polje DateField enako 10/12/2008.

Ali je zgornja vrstica jasna? Je to 10. decembra ali 12. oktobra? Na srečo smo skoraj prepričani, da je leto v poizvedbi leto 2008.

Ali naj bo datum poizvedbe naveden kot MM / DD / LLLL ali DD / MM / LLLL ali morda LLLLLMDD? In tu igrajo vlogo regionalne nastavitve?

Oblikovanje MS Access, Jet, Date Time Formatting

Ko uporabljate Access in JET (nadzor dbGo - ADO Delphi) oblikovanje SQL za datumsko polje mora biti * vedno *:

# LLLL-MM-DD #

Vse drugo bi lahko delovalo z omejenim testiranjem, vendar lahko pogosto privede do nepričakovanih rezultatov ali napak na uporabnikovem računalniku.

Tu je funkcija Delphi po meri, ki jo lahko uporabite za oblikovanje vrednosti datuma za poizvedbo Access SQL.

funkcijo DateForSQL (konst datum: TDate): niz;

var

y, m, d: beseda;

začeti

DecodeDate (datum, y, m, d);

rezultat: = Oblika ('#%. * d -%. * d -%. * d #', 4, y, 2, m, 2, d);

konec;

Za "29. januarja 1973" bo funkcija vrnila niz "# 1973-01-29 #".

Dostop do zapisa časa do datuma SQL?

Glede oblikovanja datuma in časa je splošna oblika:

# yyyy-mm-dd HH: MM: SS #

To je: # leto-mesec-danSPACEhour: minuta: sekunda #

Takoj, ko zgradite veljaven časovni niz datuma za SQL z zgoraj navedeno splošno obliko in ga preizkusite z uporabo katere koli od komponent nabora podatkov Delphi kot TADOQuery, boste prejeli grozno "Objekt parametra ni pravilno določen. Podani so bili neskladni ali nepopolni podatki." napaka med izvajanjem!

Težava z zgornjo obliko je v znaku ":" - saj se uporablja za parametre v parametriziranih poizvedbah Delphi. Kot v "... WHERE DateField =: dateValue" - tukaj je "dateValue" parameter in "": se uporablja za označevanje.

Eden od načinov za "popravljanje" napake je uporaba druge oblike za datum / čas (nadomestite ":" z "."):

# yyyy-mm-dd HH.MM.SS #

In tukaj je funkcija Delphi po meri za vrnitev niza iz vrednosti časovnega datuma, ki jo lahko uporabite pri izdelavi poizvedb SQL za dostop, kjer morate iskati vrednost datuma-časa:

funkcijo DateTimeForSQL (konst dateTime: TDateTime): niz;

var

y, m, d: beseda;

ura, min, sek, msec: beseda;

začeti

DecodeDate (datumTime, y, m, d);

DecodeTime (datumTime, ura, min, sek, msec);

rezultat: = Oblika ('#%. * d -%. * d -%. * d%. * d.%. * d.%. * d #', 4, y, 2, m, 2, d, 2 , ura, 2, min, 2, sek);

konec;

Oblika izgleda čudno, vendar bo prišlo do pravilno oblikovane vrednosti časovnega niza datuma, ki jo bomo uporabili pri poizvedbah SQL!

Tu je krajša različica z uporabo rutine FormatDateTime:

funkcijo DateTimeForSQL (konst dateTime: TDateTime): niz;

začeti

rezultat: = FormatDateTime ('# yyyy-mm-dd hh.nn.ss #', datumTime);

konec;

Poglej si posnetek: Ego or Intuition? How do I know whether it's my true self talking or my ego talking? - Teal Swan (April 2020).