Subject Re: date data in SQL statement
From Pieter van Heerden <psvh@mweb.co.za>
Date Fri, 24 Apr 2015 22:46:59 -0400
Newsgroups dbase.getting-started

Mervyn Bick Wrote:

> On Fri, 24 Apr 2015 16:05:40 +0200, Pieter van Heerden <psvh@mweb.co.za>  
> wrote:
>
> > In teh follwing:
> >
> > q.sql = "select * where rdate >= :startdat and rdate < :enddate"
> > q.params["startdate"] = form.startdate.value
> > q.params["enddate"] = form.enddate.value
> >
> > the startdate and enddates seems to be ignored, e.g. extraction will  
> > take place to beyond enddate.  Form.startdate and form.enddate comes  
> > from entryfields on the form linked to date spinbox fields in the table  
> > that is formatted as DMY.
> >
> > I have tried to recreate the SQL query in the SQL builder by inputting  
> > specific dates, but is then confronted with the problem  that date  
> > format seems to be wrong - error "Type mismatch in expression".  How  
> > does one enter date in the SQL builder, I have tried '...', {...},  
> > ctod(), date(), {d '...'} but none works as defined in SQL manuals I  
> > have looked at and I could not find the correct format explained in the  
> > OLH system.  The date format in this case is assumed to be yyyy-mm-dd.
> >
> > Where woiuld I find an example code in dBase help function that would  
> > show me what a date format in an SQL statement should look like?  The  
> > date() function under local SQL tells me about extract() but not about  
> > what the date should look like.
>
> Try the following
>
> q.sql = "select * where rdate between :startdate and :enddate"
> q.params["startdate"] = form.startdate.value
> q.params["enddate"] = form.enddate.value
>
> The BETWEEN predicate will include the start date and the end date in the  
> selection.  If you don't want the end date included in the selection as  
> indicated by your use of rdate < :enddate then simply deduct one from the  
> value supplied by form.enddate.value.
>
> q.params["enddate"] = form.enddate.value - 1
>
>
> In a localSQL statement there are only two formats in which to enter a  
> literal date namely 'mm/dd/yyyy' (American) or 'dd.mm.yyyy' (German).  
> This applies no matter what the computer's DATE format is set to.  This  
> information is tucked away in the localSQL help file at C:\Program  
> Files\Common Files\Borland\BDE\localsql.hlp   Have a look at "date  
> formats" in this file.
>
> Have a look at the code at the top of the attached example.  I've used the  
> American format to create the table even though the date format on my  
> computer is YMD.
>
> When supplying parameters to a query the values must be in the computer's  
> DATE format.  In the attached example program I've used
>
>        params["startdate"] = dttod(new date(1900,0,1))
>        params["enddate"] = dttod(new date(2020,11,31))
>
> I've done this so that the example will work no matter what your date  
> format is set to.  If you open the form in the designer dBASE will stream  
> out a dBASE literal date using curly brackets in the format set on the  
> computer.
>
> Mervyn.

Thanks, now for the next question relating to this:

If the enddate value is a later date than the date of the last entry in the queried table, the field values of the last record is repeated/appended to the result rowset until the enddate value is reached.  Surely extraction should stop when the last record is reached even though enddate is still somewhere in the future?