根据Query中的日期动态选择字段名称

时间:2013-12-22 03:54:08

标签: sql ms-access

我在MS访问中有一个包含多个字段的表。这些字段的字段名称代表时间段,例如2011_2,2011_3,...,2013_9,2013_10,...,2015_1,2015_2 ......

如何根据今天的日期运行选择接下来12个月作为所需字段的查询?即,如果今天是2013年12月22日,它会选择字段:2013_12,2014_1,2014_2,...,2014_12?

非常感谢。

2 个答案:

答案 0 :(得分:1)

如果在Access中有一个带有按钮的表单,则可以在代码中以字符串形式创建SQL语句,例如:

MyString = "SELECT " & Year(Now) & "_9" & " FROM myTable....."

然后您可以通过代码执行它。

您将无法创建动态构建要选择的字段列表的“标准”查询。

答案 1 :(得分:1)

您的问题的简短回答是,您无法在“访问查询”构建器中拥有动态字段名称。理想情况下,您应该修改数据,以便有一个日期字段。这样,您就可以在查询条件中为该字段指定不需要下面体操的日期范围。

如果这不可能,那么很长的答案是您需要使用VBA代码来构建查询。下面的代码应该在您的数据库中创建一个新查询(巧妙地称为" YourQuery"),它将包含您需要的字段。

由于我不知道你的桌子叫什么,所以它会是" table"在这个例子中。如果您使用此代码,则应将其更改为您的表格。

您需要在数据库的VBA模块中安装此代码,然后设计一些调​​用该函数的方法来生成新查询。例如,您可以使用" RunCode"创建一个宏。使用" DynamicQuery()"的动作作为运行的程序。请注意,如果本月的查询已经存在,则函数调用将失败,因此如果由于某种原因需要再次运行它,请手动删除(您还可以添加其他代码来实现此功能)。

同样,仅仅因为你可以做某事并不意味着你应该这样做。你真的应该重新设计你的桌子,这样你就不必采用这样的解决方法。

Public Function DynamicQuery()

Dim strSQL As String
dim datFieldDate As Date
Dim strYearMonth As String
Dim strThisMonth As String
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim i As Integer

Set dbs = CurrentDb

strThisMonth = Year(Date) & "_" & Month(Date)

strSQL = "SELECT table." & strThisMonth

For i = 1 to 12

datFieldDate = DateAdd("m",i,Date)
strYearMonth = Year(datFieldDate) & "_" & Month(DatFieldDate)

strSQL = strSQL & ", table." & strYearMonth

Next i

strSQL = strSQL & " FROM table;"

Set qdf = dbs.CreateQueryDef("YourQuery_" & strThisMonth, strSQL)

Set qdf = Nothing
Set dbs = Nothing

End Function