本文是由于我在Access数据库中遇到的问题而导致的。
SQL假定日期采用美国格式:MM / DD / YYYY。 假设将日期输入到MS Access表单中,然后在基础SQL查询中使用该日期。 如果日期为英国格式DD / MM / YYYY,则可能会出现不可预测的结果,因为Access试图将日期解释为美国格式。 如果得出有效日期,则该过程将更改日期。 如果原始日期不能解释为美国格式的有效日期,则保留原始日期。
一个例子将说明。
在Access表单中名为test_date的控件中输入日期。 输入的日期是2010年3月6日,对应于英国格式的06/03/2010。
假设日期包含在某些基础VBA中的SQL语句中,例如
"SELECT [field_1] FROM tbl_Events WHERE [date_Event]<#" & test_date & "#;"
实际执行的SQL语句是
"SELECT [field_1] FROM tbl_Events WHERE [date_Event]<#03/06/2010#;"
这不是必需的结果。
另一方面,如果日期为2010年3月31日,则SELECT语句将正确地为
"SELECT [field_1] FROM tbl_Events WHERE [date_Event]<#31/03/2010#;"
因为将31/03/2010解释为美国格式不会产生有效日期-因此该日期保持不变。
以下子例程确保日期始终以预期的美国格式显示给SQL查询。
Public Function DateforSQL(thisDate As Date) As String
'
'This function returns a string representing the date thisDate (in UK dd/mm/yyyy format)
' converted to US format - mm/dd/yyyy. It is necessary because MS Access (or its underlying
' JET engine?), assumes that dates are in US format
Dim dayStr As Integer, monthStr As Integer, yearStr As Integer
dayStr = Day(thisDate)
' This function returns the day of the month as an integer
monthStr = Month(thisDate)
' This function returns the month, as an integer
yearStr = Year(thisDate)
' This function returns the year, as an integer
DateforSQL = monthStr & "/" & dayStr & "/" & yearStr
Exit Function
End Function
DateforSQL是一个String变量,因此可在VBA SQL语句中使用,例如: "SELECT [field_1] FROM tbl_Events WHERE [date_Event]<#'" & DateforSQL(test_date) & "'#;"
本文探讨了MS Access数据库在处理英国日期格式(DD/MM/YYYY)时可能产生的问题,尤其是在SQL查询中。介绍了如何使用VBA函数DateforSQL转换日期格式,确保SQL查询始终接收美国标准的MM/DD/YYYY格式日期。
2117

被折叠的 条评论
为什么被折叠?



