我在Access VBA中使用Date语句编写了一些代码。直到本月初,它一直运行良好,但现在我看到Date已自动将格式从dd/mm/yyyy
更改为mm/dd/yyyy
。其他人遇到过同样的问题吗?
无论语言环境如何,默认的Access SQL日期格式都是mm/dd/yyyy。如果您使用无效的日期格式,它将"有益"地尝试将其转换为您的有效日期。
因此,如果您使用"30/09/2008",它将识别您使用的是dd/mm/yyyy,并对其进行适当转换。但是,像"10/01/2008"这样的值是一个有效的mm/dd/yyyy值,因此它不会被转换,并且存储不正确,以防您实际指的是dd/mm/yyyy。。。。
解决方案是在Access SQL语句中使用日期值之前,始终将日期值转换为mm/dd/yyyy字符串。在这里,您必须小心一点,因为在非美国语言环境中使用VBA日期格式掩码可能无法完全像您所期望的那样工作(例如,将"mm/dd/yyyy"解释为"本地化的短日期格式"会很有帮助),因此请使用您的特定Access/VBA版本仔细测试。
Access需要一个明确的日期。通常建议您使用yyyy/mm/dd,而不考虑区域设置。例如:
strSQL="SELECT SomeDate FROM tblT WHERE SomeDate=#" & Format(DateVar, "yyyy/mm/dd") & "#"
试试这个代码:
stLinkCriteria = "[ProjectDate] Between #" & Format(CDate(Me![txtDateFrom]), "mm/dd/yyyy") & "# And #" & Format(CDate(Me![txtDateTo]), "mm/dd/yyyy") & "#"
它对我有效。
这是有效的:
sentenciaSQL = "UPDATE Numeraciones " & _
"SET Valor = " & Valor & ", " & _
"Fecha = #" & **Format(fecha,"mm/dd/yyyy HH:nn:ss") & "#, " &** _
"Id_Usuario = " & Id_Usuario & _
" WHERE Nombre = '" & Nombre & "'"
我非常成功地使用了datevalue()函数。当从未绑定的控件中获取日期时,它似乎足够聪明,可以正确解释格式"dd/mm/yyyy"。因此,像这样的Jet SQL查询
"Select * from DateTable where StartDate = datevalue(" & me!TxtStartDate & ");"
似乎每次都有效。
我在尝试通过VBA构建SQL字符串时遇到了同样的问题。我的区域设置使用dd/mm/yyyy,我试图将从表单中未绑定的文本框中获取的数据放入SQL语句中。这个问题是由于我宣布,比方说,varMyDate为";日期";类型,因此引擎甚至在格式化之后也恢复了格式。由于你真的在构建一个字符串,所以逻辑和正确的数据类型是";字符串";,这就解决了问题。