[AccessD] Filtering with International Dates

Gustav Brock Gustav at cactus.dk
Fri Sep 23 07:59:07 CDT 2011


Hi Rocky

Yes, that will work. It will return #09/23/2011# for today.

I've never noticed any difference between Format and Format$ (and all the other old BASIC string handling functions with or without a trailing $).
SomeFunction$ is claimed to always return a string, but I've never found, say, Trim to return anything else than a string. Maybe it is just to be compatible with old QBasic or similar.

/gustav


>>> rockysmolin at bchacc.com 23-09-2011 14:35 >>>
Gustav:

Dang - it's like taking a class.  :)

I found this on the web as you suggest:

Format$(Forms!frmPOReport!txtGEPromisedDate, "\#mm\/dd\/yyyy\#") 

(Don't know why the $ after Format but it compiles OK)
 
And it seems to work.  But I have to comb through my manufacturing app now -
which is a very date driven app, lots of reports where I give the user the
option to filter by date - and change those occurrences to something which
will be as bulletproof as possible.

It looks like that's the best approach in your opinion?

Rocky

-----Original Message-----
From: accessd-bounces at databaseadvisors.com 
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock
Sent: Friday, September 23, 2011 3:11 AM
To: accessd at databaseadvisors.com 
Subject: Re: [AccessD] Filtering with International Dates

Hi Rocky

You are a clever man not to be fooled!

There really is no reason to convert dates to numerals. If you can use the
date value, use it as is, if not - as often when you build SQL strings -
convert it to a proper string expression. The proven method is to use Format
and the ISO format:

Format(somedatetime, "yyyy\/mm\/dd hh\:nn\:ss") For JET SQL this must be
wrapped in #..#, for SQL Server it is single quotes '..'
You may get away with using the US mm/dd/yyyy format but it will fail for
ADO and FindFirst, thus you can just as well make it a habit to use the ISO
format which now is the preferred for SQL Server as well.

If you need to cut off a time part to obtain the date part only, a safe and
the fastest method is Fix:

  Fix(somedatetime)

because it:

 - works correctly for dates prior to 1899-12-30
 - returns data type date
 - always rounds off
 - is native to SQL

The use of CDbl or CLng is not very useful. CDbl just returns the underlying
data type (Double) of data type Date so you should CDate instead, and CLng
will round PM time parts incorrectly, and they both fail for a clean string
input like "5/3/2005" which CDate does not.
If you need to convert strings to date and time, use CDate for time
expressions or to include a time part with a date, or DateValue for dates
where the time part should be excluded.

When to use date value and when a string expression for a date value is
quite simple. When a function is used in SQL, it should return a date value;
when you build a SQL string it must be a string expression. Thus, as
mentioned by Stuart, this will work because CDate and DateValue (and
TimeValue) understands a string formatted as the local settings of Windows:

  "where [datefield] = Datevalue('" & txtDate & "')"

as will this:

  "where [datefield] = #" & Format(DateValue(txtDate), "yyyy\/mm\/dd") & "#"

which, as Format - when using a date format - will try to read the value to
format as a date, can be reduced to:

  "where [datefield] = #" & Format(txtDate, "yyyy\/mm\/dd") & "#"

/gustav


>>> rockysmolin at bchacc.com 23-09-2011 05:17 >>>
What happens if you use CDbl on a date string with no time?

R 





More information about the AccessD mailing list