正如“用 Visual Basic 编写国际化代码”中说明的那样,不同的国家/地区具有不同的日期格式。当应用程序执行比较两个日期的操作时,为了可靠,日期必须以唯一的格式存储,而忽略其区域。在 Visual Basic 中,数据库引擎存储一日期/时间值作为 DateSerial 值,它由 8 位浮点数表示,日期为整数部分,时间为分数部分。这种表示方法完全不依赖于区域,而且可使用国际日期/时间格式执行日期/时间比较操作。
结构化查询语言 (SQL) 是 ANSI 标准,Visual Basic 也遵从该标准。存入表和数据库中的日期,使用的是英语/美国格式(月/日/年)。Microsotft Jet 数据库引擎也采用这种格式。如果使用非美国日期格式,用这些字段查寻时可能返回错误的记录或没有记录返回。
该约束同样适用于 Filter 属性,Recordset 对象中的 FindFirst, FindNext, FindPrevious 和 FindLast 方法,以及 SQL 语句中的 WHERE 子句。
这里有两个函数可以解决 SQL 标准的限制。避免代码中使用日期/时间,代之以使用 DateValue 或 DateSerial 函数生成所需日期。DateValue 函数用系统的 Short Date 设置解释所提供的字符串,DateSerial 函数使用一系列可在任何区域中运行的参数。如果 SQL 查询或 Filter 属性中使用日期/时间,则日期和时间只能使用英语/美国格式,除此之外别无选择。
以下示例说明了如何执行基于日期的查询。第一个例子使用非美国日期格式。由于日期表达式中出现语法错误,返回的 Recordset 是空的:
Dim mydb As Database Dim myds As Recordset Set mydb = OpenDatabase("MyDatabase.mdb") '
包含日期/时间字段的表。Set myds = mydb.OpenRecordset("MyTable,dbopenDynaset")
'
日期格式是日/
月/
年。myds.FindFirst "DateFiled > #30/03/97#"
'
数据控件和mydb
相联。Data1.Recordset.Filter = "DateFiled = #30/03/97#"
mydb.Close
myds.Close
然而,下面的例子由于日期采用适当的格式,因此在任何区域里执行都正确:
Dim mydb As Database Dim myds As Recordset Set mydb = OpenDatabase("MyDatabase.mdb") '
包含日期/时间字段的表。Set myds = mydb.OpenRecordset("MyTable, dbopenDynaset")
myds.FindFirst "DateFiled > #03/30/97#" '
日期格式是'
月/
日/
年。'
数据控件和mydb
相联。Data1.Recordset.Filter = "DateFiled = _
DateValue(""" & DateString & """)"
mydb.Close
myds.Close