Formatering av dato og klokkeslett for Access SQL i Delphi

online kalenderplanlegger

Getty Images/chokkicx





Få noen gang det forferdelige ' Parameterobjektet er feil definert. Inkonsekvent eller ufullstendig informasjon ble gitt ' JET-feil? Slik retter du opp situasjonen.

Når du trenger å opprette en SQL-spørring mot en Access-database der en dato (eller en dato-klokkeslett)-verdi brukes, må du sørge for at riktig formatering brukes.



For eksempel, i en SQL-spørring: 'SELECT * FROM TBL WHERE DateField = '10/12/2008'' vil du hente alle postene fra tabellen kalt TBL der et generelt datofelt DateField er lik 10/12/2008.

Er linjen over klar? Er det 10. desember eller 12. oktober? Heldigvis er vi ganske sikre på at året i søket er 2008.



Skal datodelen av spørringen angis som MM/DD/ÅÅÅÅ eller DD/MM/ÅÅÅÅ eller kanskje ÅÅÅÅMMDD? Og spiller regionale innstillinger en rolle her?

MS Access, Jet, Dato Tidsformatering

Når du bruker Access og JET ( dbGo - ADO Delphi kontroller ) formateringen av SQL for datofelt skal *alltid* være:

Alt annet kan fungere i begrenset testing, men kan ofte føre til uventede resultater eller feil på brukerens maskin.

Her er en tilpasset Delphi-funksjon du kan bruke til å formatere en datoverdi for Access SQL-spørringen.



For '29. januar 1973' vil funksjonen returnere strengen '#1973-01-29#'.

Få tilgang til SQL Dato Time Format?

Når det gjelder dato- og klokkeslettformatering, er det generelle formatet:



Dette er: #år-måned-dagSPACEtime:minutt:sekund#

Så snart du konstruerer en gyldig dato- og klokkeslettstreng for SQL ved å bruke det generelle formatet ovenfor og prøver den ved å bruke en av Delphis datasettkomponenter som TADOQuery, vil du motta den forferdelige 'Parameterobjekt er feil definert. Inkonsekvent eller ufullstendig informasjon ble gitt' feil klkjøretid!



Problemet med formatet ovenfor er i tegnet ':' - som det brukes for parametere i parametriserte Delphi-spørringer. Som i '... WHERE DateField = :dateValue' - her er 'dateValue' en parameter og ':' brukes til å markere den.

En måte å 'fikse' feilen på er å bruke et annet format for dato/klokkeslett (erstatt ':' med '.'):



Og her er en tilpasset Delphi-funksjon for å returnere en streng fra en dato- og klokkeslettverdi du kan bruke når du konstruerer SQL-spørringer for Access der du trenger å søke etter en dato-tidsverdi:

Formatet ser rart ut, men vil resultere i den riktig formaterte dato- og tidsstrengverdien som skal brukes i SQL-spørringer!

Her er en kortere versjon som bruker FormatDateTime-rutinen: