MS ACCESS 表格 VBA 打开 Where 子句 - 美国 v 澳大利亚日期格式
MSACCESS Form VBA Open Where Clause - US v AU Date Formatting
大家早上好,
这应该是一个简单的修复,我四处搜索并找到了看起来应该有效的东西,但它们似乎并没有...
所以 - 这是一个简单的 "Open this form and show only records from This date" 函数,你猜对了,好的 ol' US of A date formatting 是问题所在,无论我尝试哪种方式,都无法解决问题...
所以 - 这是表单代码...
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "# " & NEWDATE & " #"
查找 NEWDATE...
我从几个组合框(CBOYear 和 CBOMonth)和一个代表月份日期的字段中删除日期部分(数据格式为“1st”或“2nd”等...)
我连接各个组件...
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
msgbox NEWDATE 弹出窗口产生正确的数据(即 1/3/18)
但是当我 运行 代码时,它要么选择所有内容,要么什么都不选择...该函数唯一起作用的时间是当日期字段为 13 或更高(即 13/3/18)时 - 因此它可以确定要使用的正确格式。
我确定正确答案已经在某处 - 正确的问题可能是我没想过要搜索的。
我曾尝试在表单打开代码之前和之内使用 DATEVALUE()。我已尝试对美国格式进行硬编码以查看是否可行...
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "#3/1/18#"
不好...显示所有记录 - 如果我对 AU 格式进行硬编码 #1/3/18#
我的电脑设置为 AU 格式 dd/mm/yy
那么...在调用 Openform 之前,我需要使用哪个函数将澳大利亚日期字符串转换为美国日期字符串,以便打开正确的记录?或者是否有更好的方法在 Docmd 行中编写 WHERE 子句来实现此结果? - 或者我是否需要将所有日期字段重置为美国格式并仅在表格上将它们转换回澳大利亚格式?
感谢反馈...
在 VBA 和 VB6 中,使用 #
语法的 date-literals always M/dd/yyyy
格式,无论用户的日期格式设置。这是 VBA/VB6 在美国发展的遗产,在本地化成为一个问题之前(美国 the only country 使用不合逻辑的 MM/dd/yyyy
格式)。
注意它是 M/dd/yyyy
而不是 MM/dd/yyyy
- 所以省略任何前导零。
此处记录:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/date-data-type
相同的规则也适用于 Access SQL 中的 date-literals(与 VBA/VB6 不同)。幸运的是,在 SQL Server 中,您总是在引号中使用 ISO 8601 yyyy-MM-dd
格式……虽然 Access 令人遗憾。
您的第一个问题是您没有将 NewDate
与某物进行比较。
您的第二个问题是您使用字符串连接按日期进行过滤,这导致了错误的日期。
您可以查看 以了解在 Access 中使用参数的不同方式。
您的最终代码可能如下所示:
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
DoCmd.SetParameter("NewDateParam", NEWDATE)
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "SomeDateField = NewDateParam"
或者,如果时间可能与日期一起存储:
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
DoCmd.SetParameter("NewDateParam", NEWDATE)
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "SomeDateField - NewDateParam < 1"
您只需要一个格式正确的日期值字符串表达式 - 以及正确的语法:
Dim NEWDATE As Date
Dim WhereCondition As String
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
WhereCondition = "[NameOfYourDateField] = #" & Format(NEWDATE, "yyyy\/mm\/dd") & "#"
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , WhereCondition
大家早上好, 这应该是一个简单的修复,我四处搜索并找到了看起来应该有效的东西,但它们似乎并没有...
所以 - 这是一个简单的 "Open this form and show only records from This date" 函数,你猜对了,好的 ol' US of A date formatting 是问题所在,无论我尝试哪种方式,都无法解决问题...
所以 - 这是表单代码...
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "# " & NEWDATE & " #"
查找 NEWDATE...
我从几个组合框(CBOYear 和 CBOMonth)和一个代表月份日期的字段中删除日期部分(数据格式为“1st”或“2nd”等...)
我连接各个组件...
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
msgbox NEWDATE 弹出窗口产生正确的数据(即 1/3/18)
但是当我 运行 代码时,它要么选择所有内容,要么什么都不选择...该函数唯一起作用的时间是当日期字段为 13 或更高(即 13/3/18)时 - 因此它可以确定要使用的正确格式。
我确定正确答案已经在某处 - 正确的问题可能是我没想过要搜索的。
我曾尝试在表单打开代码之前和之内使用 DATEVALUE()。我已尝试对美国格式进行硬编码以查看是否可行...
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "#3/1/18#"
不好...显示所有记录 - 如果我对 AU 格式进行硬编码 #1/3/18#
我的电脑设置为 AU 格式 dd/mm/yy
那么...在调用 Openform 之前,我需要使用哪个函数将澳大利亚日期字符串转换为美国日期字符串,以便打开正确的记录?或者是否有更好的方法在 Docmd 行中编写 WHERE 子句来实现此结果? - 或者我是否需要将所有日期字段重置为美国格式并仅在表格上将它们转换回澳大利亚格式?
感谢反馈...
在 VBA 和 VB6 中,使用 #
语法的 date-literals always M/dd/yyyy
格式,无论用户的日期格式设置。这是 VBA/VB6 在美国发展的遗产,在本地化成为一个问题之前(美国 the only country 使用不合逻辑的 MM/dd/yyyy
格式)。
注意它是 M/dd/yyyy
而不是 MM/dd/yyyy
- 所以省略任何前导零。
此处记录:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/date-data-type
相同的规则也适用于 Access SQL 中的 date-literals(与 VBA/VB6 不同)。幸运的是,在 SQL Server 中,您总是在引号中使用 ISO 8601 yyyy-MM-dd
格式……虽然 Access 令人遗憾。
您的第一个问题是您没有将 NewDate
与某物进行比较。
您的第二个问题是您使用字符串连接按日期进行过滤,这导致了错误的日期。
您可以查看
您的最终代码可能如下所示:
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
DoCmd.SetParameter("NewDateParam", NEWDATE)
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "SomeDateField = NewDateParam"
或者,如果时间可能与日期一起存储:
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
DoCmd.SetParameter("NewDateParam", NEWDATE)
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "SomeDateField - NewDateParam < 1"
您只需要一个格式正确的日期值字符串表达式 - 以及正确的语法:
Dim NEWDATE As Date
Dim WhereCondition As String
NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
WhereCondition = "[NameOfYourDateField] = #" & Format(NEWDATE, "yyyy\/mm\/dd") & "#"
DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , WhereCondition