【发布时间】:2010-08-14 07:39:23
【问题描述】:
在我的数据库中,我的月份名称为 1 月、2 月、3 月。
我表示字段名称是文本。当我执行按月份字段月份排序的选择查询时,它将提供二月、一月这样的输出。
我知道 FORMAT 或 db 字段表示很清楚。虽然我是 ms 访问的新手,所以我不知道正确的格式。请帮我。
【问题讨论】:
标签: ms-access
在我的数据库中,我的月份名称为 1 月、2 月、3 月。
我表示字段名称是文本。当我执行按月份字段月份排序的选择查询时,它将提供二月、一月这样的输出。
我知道 FORMAT 或 db 字段表示很清楚。虽然我是 ms 访问的新手,所以我不知道正确的格式。请帮我。
【问题讨论】:
标签: ms-access
你必须在一个模块中创建你自己的自定义函数来为你转换值。
类似
Public Function StrToMonth(strIn As String) As Integer
Dim arrMonth(12) As Variant
Dim i As Integer
arrMonth(0) = "January"
arrMonth(1) = "February"
arrMonth(2) = "March"
arrMonth(3) = "April"
arrMonth(4) = "May"
arrMonth(5) = "June"
arrMonth(6) = "July"
arrMonth(7) = "August"
arrMonth(8) = "September"
arrMonth(9) = "October"
arrMonth(10) = "November"
arrMonth(11) = "December"
For i = 0 To UBound(arrMonth) - 1
If strIn = arrMonth(i) Then
StrToMonth = i + 1
Exit Function
End If
Next i
End Function
然后您可以在查询中使用它,例如
SELECT Table1.MonthVal
FROM Table1
ORDER BY StrToMonth([MonthVal]);
【讨论】:
向表中添加一个额外的列,其月份名称具有年份中的月份数,或者更好,不要将月份存储为字符串,而是将它们存储为日期,例如2010 年 8 月 1 日,这将使这个问题更容易解决。
【讨论】:
order by month(``..field name``) asc)?
将月份存储为整数,因为当前使用字母排序返回您的行(数据库如何知道这些字符串存在月份?):April、August、February、January、March...
【讨论】:
您可以将月份转换为日期以进行排序:
SELECT MonthName
FROM SomeTable
ORDER BY CDate("1/" & [MonthName] & "/2010");
【讨论】:
如果您认为将月份存储为实际日期是不合适的(当然可能——我并不是在批评该决定),您希望通过以最有效的格式存储数据来最大限度地提高性能.
这很可能将月份存储为整数。
出于显示目的,例如在报告或表单中,您可以使用格式显示月份名称。这有点棘手,因为没有直接转换(其中“MonthField”是指您存储月份整数的字段):
Format(DateSerial(Year(Date()), MonthField, 1), "mmmm")
另一种方法是使用一个将月份整数映射到月份名称的表,但这会添加一个连接,如果该字段可以为空,则必须有一个外部连接,而且成本要高得多在性能方面比内部连接。
请记住,您只能在表示层中使用 Format() 语句,即,作为表单或报表上的控件的控制源。在表单上,您可能会为此使用 2 列组合框,因此用户会看到月份名称,但存储的值实际上是月份整数。在这种情况下,表格可能有意义,但我不确定它是否比仅输入值列表具有任何真正的优势——这不像是易失性数据,即可能需要编辑的数据(这是您使用表格代替值列表的主要原因)!
编辑:
正如@HansUp 所指出的,VBA 中有一个 MonthName() 函数(我不知道它存在!),所以这使得上述所有方法比它需要的更复杂——你可以在表示层不需要表格或复杂的 Format() 语句。
【讨论】:
MonthName(MonthField)